import { PeerRole } from "./codec/MessageCodec.js"; import { NetObject } from "./objects/NetObject.js"; import { NetObjectRegistry } from "./objects/NetObjectRegistry.js"; import { NetUser } from "./NetUser.js"; import { PresenceBroadcaster } from "./presence/PresenceBroadcaster.js"; import { NetEvents } from "./rpc/NetEvents.js"; import { Transport } from "./transport/Transport.js"; import { VoiceChat } from "./voice/VoiceChat.js"; import * as THREE from "three"; //#region src/addons/netblocks/src/core/NetSession.d.ts export interface NetSessionOptions { /** Display name announced to other peers. */ displayName?: string; /** * Coarse role announced to other peers. Defaults to `'user'`. Use * `'agent'` for autonomous bots and `'device'` for shared/headless * room participants (TVs, kiosks, etc). */ role?: PeerRole; /** Override the presence broadcast frequency in Hz (default: 20). */ presenceHz?: number; /** Override the netobject broadcast frequency in Hz (default: 20). */ netObjectHz?: number; /** * Convergence rate for non-owner interpolation, expressed as the * exponential decay constant in `1 - exp(-rate * dt)`. Higher values * snap faster. Default 12 matches the legacy fixed-fraction behaviour * at 60 fps; at 90/120 Hz the dt-based form keeps the convergence * speed visually identical instead of overshooting. */ netObjectInterpRate?: number; /** Whether to enable voice chat at session start. Defaults to false. */ voice?: boolean; } export type NetSessionEventName = 'open' | 'close' | 'user-join' | 'user-update' | 'user-leave' | 'voice-state' | 'local-voice-state' | 'peer-voice-state' | 'playback-state' | 'voice-error'; /** A local playback preference change, independent of microphone intent. */ export interface PlaybackStateEventDetail { /** Absent for the master toggle; otherwise the peer's individual choice. */ peerId?: string; muted: boolean; } export interface UserEventDetail { user: NetUser; } export declare class NetSession extends EventTarget { readonly transport: Transport; readonly events: NetEvents; readonly netObjects: NetObjectRegistry; readonly presence: PresenceBroadcaster; readonly voice: VoiceChat; private _root; private _users; /** * Tracks users we created from a non-hello first message. We defer * `user-join` until either their hello arrives (so the listener sees a * populated displayName) or a small grace window elapses. */ private _pendingJoinTimers; private _opts; private _spatialVoice?; private _playbackMuted; private _mutedPlaybackPeers; private _isOpen; private _lastUpdateMs; private _capabilities; private _onTransportPeerJoin; private _onTransportPeerLeave; private _onTransportMessage; private _onPageHide; constructor(transport: Transport, root: THREE.Object3D, opts?: NetSessionOptions); get isOpen(): boolean; get localPeerId(): string; /** Local display name, as supplied via `NetSessionOptions.displayName`. */ get displayName(): string | undefined; /** Local self-reported role. Defaults to `'user'`. */ get role(): PeerRole; get users(): ReadonlyMap; /** Whether all incoming voice is muted for this local listener. */ get playbackMuted(): boolean; /** * Mute incoming voice only, retaining each peer's individual choice. * May be set before open(); never changes the microphone or scene sounds. * Emits `playback-state` only when this preference changes. */ setPlaybackMuted(muted: boolean): void; /** * Mute a current peer's incoming voice for this listener only. * Retained across stream replacement/removal, cleared on peer leave/close. * Emits `playback-state` only when this individual preference changes. * * @throws TypeError for a non-boolean mute or an empty/non-string peer ID. * @throws RangeError if the peer is not in `users`. */ setPeerPlaybackMuted(peerId: string, muted: boolean): void; /** Individual choice, unaffected by master mute; false for departed peers. */ isPeerPlaybackMuted(peerId: string): boolean; private _validatePlaybackPeerId; /** Connect the underlying transport and announce ourselves. */ open(roomId: string): Promise; close(): void; /** Register an existing NetObject so its transform is replicated. */ addNetObject(obj: NetObject): void; /** Convenience: create + auto-add a NetObject parented to `root`. */ createNetObject(opts?: ConstructorParameters[0]): NetObject; removeNetObject(obj: NetObject): void; /** Claim ownership of an object (e.g., on grab). */ claim(obj: NetObject): void; /** Release ownership of an object (e.g., on release). */ release(obj: NetObject): void; /** Per-frame tick. Call from the host xb.Script's `update()`. */ update(_time?: number, _frame?: XRFrame): void; private _sendNet; private _onPeerJoin; private _onPeerLeave; private _onMessage; private _onVoiceTrack; private _onVoiceTrackRemoved; } //#endregion