diff --git a/src/docs/src/Peer/connect.md b/src/docs/src/Peer/connect.md index 9f82f93a9..d74a7077f 100644 --- a/src/docs/src/Peer/connect.md +++ b/src/docs/src/Peer/connect.md @@ -45,6 +45,7 @@ A `Promise` that resolves to a `PuterPeerConnection` instance. - `send(data)` - Send a message to the peer. Supports strings, `Blob`, `ArrayBuffer`, or `ArrayBufferView`. - `close(reason)` - Close the connection. +- `owner` (`object`) - Information about the user who created the server. - `open` event: Fired when the data channel is ready. - `message` event: Fired when a message is received (`event.data`). - `close` event: Fired when the connection closes (`event.reason`). diff --git a/src/docs/src/Peer/serve.md b/src/docs/src/Peer/serve.md index 924580a05..d065bc346 100644 --- a/src/docs/src/Peer/serve.md +++ b/src/docs/src/Peer/serve.md @@ -40,6 +40,7 @@ A `Promise` that resolves to a `PuterPeerServer` instance. ### `PuterPeerServer` properties and events - `inviteCode` (`string`) The code you share with other clients. +- `connections` (`Map`) map of all connected clients - `connection` event: Fired when a client connects. - `event.conn` (`PuterPeerConnection`) The connection to the client. - `event.user` (`object`) Metadata about the connecting user (if available). diff --git a/src/puter-js/src/modules/Peer.js b/src/puter-js/src/modules/Peer.js index 4dce00b21..09bc7810c 100644 --- a/src/puter-js/src/modules/Peer.js +++ b/src/puter-js/src/modules/Peer.js @@ -42,8 +42,7 @@ class PuterPeerServer extends EventTarget { #wsconn; #oncreateresolve; - /** @type {Map} */ - #connections = new Map(); + connections = new Map(); inviteCode; #peerConfig; @@ -112,7 +111,7 @@ class PuterPeerServer extends EventTarget { if ( data.server.connect ) { let uuid = data.server.connect.id; let connection = new PuterPeerConnection(this.#peerConfig); - this.#connections.set(uuid, connection); + this.connections.set(uuid, connection); connection.peerconnection.onicecandidate = (e) => { if ( e.candidate ) { this.#wsconn.send( @@ -137,7 +136,7 @@ class PuterPeerServer extends EventTarget { if ( data.server.candidate ) { let uuid = data.server.candidate.id; - let connection = this.#connections.get(uuid); + let connection = this.connections.get(uuid); if ( connection ) { await connection.addIceCandidate( data.server.candidate.candidate, @@ -147,7 +146,7 @@ class PuterPeerServer extends EventTarget { if ( data.server.offer ) { let uuid = data.server.offer.id; - let connection = this.#connections.get(uuid); + let connection = this.connections.get(uuid); if ( connection ) { await connection.setRemoteDescription( new RTCSessionDescription(data.server.offer.offer), @@ -169,7 +168,7 @@ class PuterPeerServer extends EventTarget { } close () { - for ( const [uuid, connection] of this.#connections ) { + for ( const [uuid, connection] of this.connections ) { connection.close(); } this.#wsconn.onclose = null; @@ -180,6 +179,7 @@ class PuterPeerServer extends EventTarget { class PuterPeerConnection extends EventTarget { #wsconn; peerconnection; + owner; #peerConfig; #datachannel; connected = false; @@ -270,6 +270,7 @@ class PuterPeerConnection extends EventTarget { } if ( msg.connect ) { if ( msg.connect.success ) { + this.owner = msg.connect.owner; const offer = await this.createOffer(); this.#wsconn.send( JSON.stringify({ diff --git a/src/puter-js/types/modules/peer.d.ts b/src/puter-js/types/modules/peer.d.ts index 1ebace46f..b2e7ca559 100644 --- a/src/puter-js/types/modules/peer.d.ts +++ b/src/puter-js/types/modules/peer.d.ts @@ -2,7 +2,10 @@ export interface PuterPeerOptions { iceServers?: RTCIceServer[]; } -export interface PuterPeerUser extends Record {} +export interface PuterPeerUser { + username: string; + uuid: string; +} export type PuterPeerMessage = string | Blob | ArrayBuffer | ArrayBufferView; export type PuterPeerDescription = RTCSessionDescription | RTCSessionDescriptionInit; @@ -14,17 +17,17 @@ export class PuterPeerServerConnectionEvent extends Event { } export class PuterPeerConnectionMessageEvent extends Event { - readonly data: unknown; + readonly data: ArrayBuffer | string; } export class PuterPeerConnectionOpenEvent extends Event {} export class PuterPeerConnectionCloseEvent extends Event { - readonly reason?: unknown; + readonly reason?: string; } export class PuterPeerConnectionErrorEvent extends Event { - readonly error: unknown; + readonly error: string; } export interface PuterPeerServerEventMap { @@ -40,9 +43,10 @@ export interface PuterPeerConnectionEventMap { export class PuterPeerServer extends EventTarget { inviteCode?: string; + connections: Map; start (): Promise; - message (data: unknown): Promise; + message (data: ArrayBuffer | string): Promise; addEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void; addEventListener( @@ -60,11 +64,12 @@ export class PuterPeerServer extends EventTarget { export class PuterPeerConnection extends EventTarget { peerconnection: RTCPeerConnection; + owner?: PuterPeerUser; connected: boolean; closed: boolean; connect (invitecode: string): Promise; - close (reason?: unknown): void; + close (reason?: string): void; createOffer (): Promise; createAnswer (): Promise; setRemoteDescription (description: PuterPeerDescription): void;