Skip to main content

Viewport Mode Detection API

The clientViewportMode utility provides runtime detection of different viewport modes for conditional rendering and behavior.

Overview

Hyperscape supports three viewport modes:
  1. Normal Mode - Standard gameplay (default)
  2. Stream Mode - Optimized for streaming capture (/stream.html or ?page=stream)
  3. Embedded Spectator Mode - Embedded spectator view (?embedded=true&mode=spectator)

API Reference

isStreamPageRoute(win?: Window): boolean

Detects if the current page is running in streaming capture mode. Returns: true if:
  • URL pathname ends with /stream.html
  • URL query parameter page=stream
Example:

isEmbeddedSpectatorViewport(win?: Window): boolean

Detects if running as an embedded spectator (e.g., in betting app iframe). Returns: true if:
  • URL query parameters: embedded=true AND mode=spectator
  • OR window config: __HYPERSCAPE_EMBEDDED__=true AND __HYPERSCAPE_CONFIG__.mode="spectator"
Example:

isStreamingLikeViewport(win?: Window): boolean

Detects any streaming-like viewport (stream OR embedded spectator). Returns: true if either isStreamPageRoute() or isEmbeddedSpectatorViewport() returns true. Example:

Usage Patterns

Conditional UI Rendering

Streaming Optimizations

Spectator Controls

URL Patterns

Stream Mode

Embedded Spectator Mode

Normal Mode

Vite Multi-Page Build

The client now builds separate entry points for different modes: vite.config.ts:
Output:
  • dist/index.html - Main game bundle
  • dist/stream.html - Streaming capture bundle (minimal UI)

Integration with Streaming Pipeline

The streaming capture pipeline uses these URLs: ecosystem.config.cjs:
Fallback Order:
  1. Stream page (?page=stream) - Preferred for clean capture
  2. Embedded spectator (?embedded=true&mode=spectator) - Fallback if stream page fails
  3. Normal game (/) - Last resort

Testing

Migration Guide

Before (Manual URL Parsing)

After (Utility Functions)

  • packages/shared/src/runtime/clientViewportMode.ts - Core implementation
  • packages/client/src/stream.html - Streaming entry point
  • packages/client/src/stream.tsx - Streaming React entry
  • ecosystem.config.cjs - PM2 streaming configuration
  • packages/client/vite.config.ts - Multi-page build configuration