/**
 * `@shade/transport-webrtc` — V3.11 P2P transport.
 *
 * Direct peer-to-peer `RTCDataChannel` between Shade clients when NAT/
 * firewall allows. Signaling rides Shade's existing control plane
 * (`Shade.send` / `Shade.onMessage`); chunk data flows direct (or via
 * TURN-relay when ICE forces it). The wire payload is still encrypted
 * with Shade's ratchet/streams crypto — WebRTC's DTLS-SRTP is just an
 * additional transport-secrecy layer.
 *
 * Quick start:
 *
 * ```ts
 * import { createShade } from '@shade/sdk';
 * import {
 *   WebRtcConnectionManager,
 *   WebRtcSignalingChannel,
 *   WebRtcTransferTransport,
 *   nativeRtcFactory,
 *   createShadeBridgeFromShade,
 * } from '@shade/transport-webrtc';
 *
 * const shade = await createShade({ ... });
 * const signaling = new WebRtcSignalingChannel(createShadeBridgeFromShade(shade));
 * const manager = new WebRtcConnectionManager({
 *   factory: nativeRtcFactory(),
 *   signaling,
 *   config: { iceServers: [{ urls: 'stun:stun.l.google.com:19302' }] },
 * });
 * const transport = new WebRtcTransferTransport({ manager });
 * shade.configureTransfers({ resolveBaseUrl, transport });   // see SDK docs
 * ```
 *
 * For receiver-side use, pass `receiver` hooks to the manager so it can
 * decrypt incoming chunks via `Shade.acceptTransferEnvelope`.
 */

export { WebRtcConnection, SHADE_DATACHANNEL_LABEL, generateSessionId } from './connection.js';
export type { WebRtcReceiverHooks, WebRtcConnectionDeps } from './connection.js';

export { WebRtcConnectionManager } from './manager.js';
export type { WebRtcConnectionManagerOptions } from './manager.js';

export {
  WebRtcSignalingChannel,
  MemoryShadeBridge,
} from './signaling.js';
export type { ShadeBridge, SignalingHandler } from './signaling.js';

export {
  WebRtcTransferTransport,
  DEFAULT_MAX_DATACHANNEL_MESSAGE,
} from './transport.js';
export type { WebRtcTransferTransportOptions } from './transport.js';

export {
  WebRtcConnectError,
  WebRtcDataChannelError,
  WebRtcSignalingError,
  WebRtcTimeoutError,
} from './errors.js';

export {
  DEFAULT_STUN_SERVERS,
  isWebRtcSignalingMessage,
  parseWebRtcSignaling,
  encodeWebRtcSignaling,
} from './types.js';
export type {
  IPeerConnection,
  IDataChannel,
  IRtcFactory,
  ShadeRtcConfig,
  ShadeIceServer,
  ShadeIceCandidate,
  ShadeRtcConnectionState,
  ShadeSdpType,
  ShadeSessionDescription,
  WebRtcSignalingMessage,
  WebRtcOfferMessage,
  WebRtcAnswerMessage,
  WebRtcIceMessage,
  WebRtcByeMessage,
  WebRtcSignalingKind,
} from './types.js';

export { NativeRtcFactory, nativeRtcFactory, isNativeRtcAvailable } from './native-rtc.js';
export { MemoryRtcFactory } from './memory-rtc.js';

export { createShadeBridgeFromShade } from './shade-bridge.js';
export type { ShadeLike } from './shade-bridge.js';

// Wire format constants — useful for adapters that want to interop.
export {
  WIRE_CHUNK,
  WIRE_RESUME_QUERY,
  WIRE_PING,
  WIRE_CHUNK_ACK,
  WIRE_RESUME_STATE,
  WIRE_PONG,
  WIRE_ERROR,
} from './wire.js';
