mirror of
https://github.com/xtr-dev/rondevu-client.git
synced 2025-12-10 10:53:24 +00:00
Refactor peer connection state machine into separate files
Split the monolithic peer.ts file into a modular state-based architecture: - Created separate files for each state class (idle, creating-offer, waiting-for-answer, answering, exchanging-ice, connected, failed, closed) - Extracted shared types into types.ts - Extracted base PeerState class into state.ts - Updated peer/index.ts to import state classes instead of defining them inline - Made close() method async to support dynamic imports and avoid circular dependencies - Used dynamic imports in state transitions to prevent circular dependency issues This improves code organization, maintainability, and makes each state's logic easier to understand and test. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
41
src/peer/state.ts
Normal file
41
src/peer/state.ts
Normal file
@@ -0,0 +1,41 @@
|
||||
import type { PeerOptions } from './types.js';
|
||||
import type RondevuPeer from './index.js';
|
||||
|
||||
/**
|
||||
* Base class for peer connection states
|
||||
* Implements the State pattern for managing WebRTC connection lifecycle
|
||||
*/
|
||||
export abstract class PeerState {
|
||||
constructor(protected peer: RondevuPeer) {}
|
||||
|
||||
abstract get name(): string;
|
||||
|
||||
async createOffer(options: PeerOptions): Promise<string> {
|
||||
throw new Error(`Cannot create offer in ${this.name} state`);
|
||||
}
|
||||
|
||||
async answer(offerId: string, offerSdp: string, options: PeerOptions): Promise<void> {
|
||||
throw new Error(`Cannot answer in ${this.name} state`);
|
||||
}
|
||||
|
||||
async handleAnswer(sdp: string): Promise<void> {
|
||||
throw new Error(`Cannot handle answer in ${this.name} state`);
|
||||
}
|
||||
|
||||
async handleIceCandidate(candidate: any): Promise<void> {
|
||||
// ICE candidates can arrive in multiple states, so default is to add them
|
||||
if (this.peer.pc.remoteDescription) {
|
||||
await this.peer.pc.addIceCandidate(new RTCIceCandidate(candidate));
|
||||
}
|
||||
}
|
||||
|
||||
cleanup(): void {
|
||||
// Override in states that need cleanup
|
||||
}
|
||||
|
||||
async close(): Promise<void> {
|
||||
this.cleanup();
|
||||
const { ClosedState } = await import('./closed-state.js');
|
||||
this.peer.setState(new ClosedState(this.peer));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user