Implement RondevuAPI and RondevuSignaler classes

Added comprehensive API client and signaling implementation:

**RondevuAPI** - Single class for all Rondevu endpoints:
- Authentication: register()
- Offers: createOffers(), getOffer(), answerOffer(), getAnswer(), searchOffers()
- ICE Candidates: addIceCandidates(), getIceCandidates()
- Services: publishService(), getService(), searchServices()
- Usernames: checkUsername(), claimUsername()

**RondevuSignaler** - ICE candidate exchange:
- addIceCandidate() - Send local candidates to server
- addListener() - Poll for remote candidates (1 second intervals)
- Returns cleanup function (Binnable) to stop polling
- Handles offer expiration gracefully

**WebRTCRondevuConnection** - WebRTC connection wrapper:
- Handles offer/answer creation
- Manages ICE candidate exchange via Signaler
- Type-safe event bus for state changes and messages
- Queue and send message interfaces

**Utilities**:
- createBin() - Cleanup function collector
- Binnable type - Cleanup function signature

All classes use the shared RondevuAPI client for consistent
error handling and authentication.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-07 17:40:17 +01:00
parent 5e673ac993
commit 58cd610694
8 changed files with 590 additions and 151 deletions

View File

@@ -1,24 +1,34 @@
/**
* Core connection types
*/
import {EventBus} from "./event-bus";
import {Binnable} from "./bin";
export interface ConnectionIdentity {
id: string;
hostUsername: string;
}
export interface ConnectionState {
state: 'connected' | 'disconnected' | 'connecting';
lastActive: number;
}
export type Message = string | ArrayBuffer;
export interface QueueMessageOptions {
expiresAt?: number;
}
export interface ConnectionInterface {
queueMessage(message: string | ArrayBuffer, options?: QueueMessageOptions): void;
sendMessage(message: string | ArrayBuffer): void;
export interface ConnectionEvents {
'state-change': ConnectionInterface['state']
'message': Message;
}
export type Connection = ConnectionIdentity & ConnectionState & ConnectionInterface;
export interface ConnectionInterface {
id: string;
host: string;
service: string;
state: 'connected' | 'disconnected' | 'connecting';
lastActive: number;
expiresAt?: number;
events: EventBus<ConnectionEvents>;
queueMessage(message: Message, options?: QueueMessageOptions): Promise<void>;
sendMessage(message: Message): Promise<boolean>;
}
export interface Signaler {
addIceCandidate(candidate: RTCIceCandidate): Promise<void> | void;
addListener(callback: (candidate: RTCIceCandidate) => void): Binnable;
}