6 Commits

Author SHA1 Message Date
6057c3c582 0.7.11 2025-11-22 17:34:11 +01:00
255fe42a43 Add optional info field to offers
- Add info field to CreateOfferRequest and Offer types
- Update README with info field examples and documentation
- Public metadata field visible in all API responses

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 17:34:11 +01:00
83fd0f84a4 0.7.10 2025-11-22 16:10:28 +01:00
aa53d5bc3d Add custom peer ID support to register method
- Update register() to accept optional customPeerId parameter
- Add TypeScript documentation with JSDoc comments
- Update README with usage examples and documentation
- Maintain backward compatibility with auto-generated IDs

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-22 16:10:24 +01:00
f5aa6e2189 0.7.9 2025-11-17 22:32:09 +01:00
afdca83640 Add createDataChannel method to RondevuPeer
Adds a public method to create RTCDataChannels for sending/receiving arbitrary data between peers. The offerer can call this method before creating an offer, and the answerer will receive the channel via the existing 'datachannel' event.

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-17 22:31:58 +01:00
7 changed files with 44 additions and 11 deletions

View File

@@ -411,7 +411,8 @@ const offers = await client.offers.create([{
sdp: 'v=0...', // Your WebRTC offer SDP
topics: ['movie-xyz', 'hd-content'],
ttl: 300000, // 5 minutes
secret: 'my-secret-password' // Optional: protect offer (max 128 chars)
secret: 'my-secret-password', // Optional: protect offer (max 128 chars)
info: 'Looking for peers in EU region' // Optional: public info (max 128 chars)
}]);
// Discover peers by topic
@@ -436,14 +437,26 @@ const newPeers = await client.offers.findByTopic('movie-xyz', {
### Authentication
#### `client.register()`
#### `client.register(customPeerId?)`
Register a new peer and receive credentials.
```typescript
// Auto-generate peer ID
const creds = await client.register();
// { peerId: '...', secret: '...' }
// { peerId: 'f17c195f067255e357232e34cf0735d9', secret: '...' }
// Or use a custom peer ID (1-128 characters)
const customCreds = await client.register('my-custom-peer-id');
// { peerId: 'my-custom-peer-id', secret: '...' }
```
**Parameters:**
- `customPeerId` (optional): Custom peer ID (1-128 characters). If not provided, a random ID will be generated.
**Notes:**
- Returns 409 Conflict if the custom peer ID is already in use
- Custom peer IDs must be non-empty and between 1-128 characters
### Topics
#### `client.offers.getTopics(options?)`
@@ -477,7 +490,8 @@ const offers = await client.offers.create([
sdp: 'v=0...',
topics: ['topic-1', 'topic-2'],
ttl: 300000, // optional, default 5 minutes
secret: 'my-secret-password' // optional, max 128 chars
secret: 'my-secret-password', // optional, max 128 chars
info: 'Looking for peers in EU region' // optional, public info, max 128 chars
}
]);
```

4
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@xtr-dev/rondevu-client",
"version": "0.7.8",
"version": "0.7.11",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@xtr-dev/rondevu-client",
"version": "0.7.8",
"version": "0.7.11",
"license": "MIT",
"dependencies": {
"@xtr-dev/rondevu-client": "^0.5.1"

View File

@@ -1,6 +1,6 @@
{
"name": "@xtr-dev/rondevu-client",
"version": "0.7.8",
"version": "0.7.11",
"description": "TypeScript client for Rondevu topic-based peer discovery and signaling server",
"type": "module",
"main": "dist/index.js",

View File

@@ -29,14 +29,21 @@ export class RondevuAuth {
/**
* Register a new peer and receive credentials
* @param customPeerId - Optional custom peer ID (1-128 characters). If not provided, a random ID will be generated.
* @throws Error if registration fails (e.g., peer ID already in use)
*/
async register(): Promise<Credentials> {
async register(customPeerId?: string): Promise<Credentials> {
const body: { peerId?: string } = {};
if (customPeerId !== undefined) {
body.peerId = customPeerId;
}
const response = await this.fetchFn(`${this.baseUrl}/register`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({}),
body: JSON.stringify(body),
});
if (!response.ok) {

View File

@@ -9,6 +9,7 @@ export interface CreateOfferRequest {
topics: string[];
ttl?: number;
secret?: string;
info?: string;
}
export interface Offer {
@@ -21,6 +22,7 @@ export interface Offer {
lastSeen: number;
secret?: string;
hasSecret?: boolean;
info?: string;
answererPeerId?: string;
answerSdp?: string;
answeredAt?: number;

View File

@@ -179,6 +179,15 @@ export default class RondevuPeer extends EventEmitter<PeerEvents> {
return this.pc.addTrack(track, ...streams);
}
/**
* Create a data channel for sending and receiving arbitrary data
* This should typically be called by the offerer before creating the offer
* The answerer will receive the channel via the 'datachannel' event
*/
createDataChannel(label: string, options?: RTCDataChannelInit): RTCDataChannel {
return this.pc.createDataChannel(label, options);
}
/**
* Close the connection and clean up
*/

View File

@@ -100,9 +100,10 @@ export class Rondevu {
/**
* Register and initialize authenticated client
* @param customPeerId - Optional custom peer ID (1-128 characters). If not provided, a random ID will be generated.
*/
async register(): Promise<Credentials> {
this.credentials = await this.auth.register();
async register(customPeerId?: string): Promise<Credentials> {
this.credentials = await this.auth.register(customPeerId);
// Create offers API instance
this._offers = new RondevuOffers(