@@ -2,11 +2,10 @@ import * as Moq from "@moq/lite";
22import type { GameConfig } from "./index.ts" ;
33import { Game } from "./index.ts" ;
44
5- const OBSERVED = [ "url" , "game- prefix" , "viewer- prefix" ] as const ;
5+ const OBSERVED = [ "url" , "prefix" , "prefix-game" , " prefix-viewer "] as const ;
66type Observed = ( typeof OBSERVED ) [ number ] ;
77
8- const DEFAULT_GAME_PREFIX = "anon/boy/game" ;
9- const DEFAULT_VIEWER_PREFIX = "anon/boy/viewer" ;
8+ const DEFAULT_PREFIX = "boy" ;
109
1110const cleanup = new FinalizationRegistry < Moq . Signals . Effect > ( ( signals ) => signals . close ( ) ) ;
1211
@@ -19,8 +18,10 @@ const cleanup = new FinalizationRegistry<Moq.Signals.Effect>((signals) => signal
1918 *
2019 * Attributes:
2120 * - `url` — MoQ relay URL
22- * - `game-prefix` — Path prefix for game broadcasts (default: "anon/boy/game")
23- * - `viewer-prefix` — Path prefix for viewer broadcasts (default: "anon/boy/viewer")
21+ * - `prefix` — Base path prefix (default: "boy"). Derives prefix-game and prefix-viewer.
22+ * **Breaking change**: previously the derived attributes were named game-prefix/viewer-prefix.
23+ * - `prefix-game` — Path prefix for game broadcasts (default: "{prefix}/game")
24+ * - `prefix-viewer` — Path prefix for viewer broadcasts (default: "{prefix}/viewer")
2425 */
2526export default class MoqBoy extends HTMLElement {
2627 static observedAttributes = OBSERVED ;
@@ -33,8 +34,9 @@ export default class MoqBoy extends HTMLElement {
3334
3435 readonly #signals = new Moq . Signals . Effect ( ) ;
3536 readonly #enabled = new Moq . Signals . Signal ( false ) ;
36- readonly #gamePrefix = new Moq . Signals . Signal ( DEFAULT_GAME_PREFIX ) ;
37- readonly #viewerPrefix = new Moq . Signals . Signal ( DEFAULT_VIEWER_PREFIX ) ;
37+ readonly #prefix = new Moq . Signals . Signal ( DEFAULT_PREFIX ) ;
38+ readonly #gamePrefixOverride = new Moq . Signals . Signal < string | undefined > ( undefined ) ;
39+ readonly #viewerPrefixOverride = new Moq . Signals . Signal < string | undefined > ( undefined ) ;
3840 readonly #sessions = new Map < string , Game > ( ) ;
3941
4042 constructor ( ) {
@@ -61,11 +63,14 @@ export default class MoqBoy extends HTMLElement {
6163 case "url" :
6264 this . connection . url . set ( newValue ? new URL ( newValue ) : undefined ) ;
6365 break ;
64- case "game- prefix" :
65- this . #gamePrefix . set ( newValue ?? DEFAULT_GAME_PREFIX ) ;
66+ case "prefix" :
67+ this . #prefix . set ( newValue ?? DEFAULT_PREFIX ) ;
6668 break ;
67- case "viewer-prefix" :
68- this . #viewerPrefix. set ( newValue ?? DEFAULT_VIEWER_PREFIX ) ;
69+ case "prefix-game" :
70+ this . #gamePrefixOverride. set ( newValue ?? undefined ) ;
71+ break ;
72+ case "prefix-viewer" :
73+ this . #viewerPrefixOverride. set ( newValue ?? undefined ) ;
6974 break ;
7075 }
7176 }
@@ -78,28 +83,37 @@ export default class MoqBoy extends HTMLElement {
7883 this . connection . url . set ( value ? new URL ( value ) : undefined ) ;
7984 }
8085
81- get gamePrefix ( ) : string {
82- return this . #gamePrefix. peek ( ) ;
86+ get prefixPath ( ) : string {
87+ return this . #prefix. peek ( ) ;
88+ }
89+
90+ set prefixPath ( value : string ) {
91+ this . #prefix. set ( value ) ;
92+ }
93+
94+ get prefixGame ( ) : string {
95+ return this . #gamePrefixOverride. peek ( ) ?? `${ this . #prefix. peek ( ) } /game` ;
8396 }
8497
85- set gamePrefix ( value : string ) {
86- this . #gamePrefix . set ( value ) ;
98+ set prefixGame ( value : string ) {
99+ this . #gamePrefixOverride . set ( value ) ;
87100 }
88101
89- get viewerPrefix ( ) : string {
90- return this . #viewerPrefix . peek ( ) ;
102+ get prefixViewer ( ) : string {
103+ return this . #viewerPrefixOverride . peek ( ) ?? ` ${ this . #prefix . peek ( ) } /viewer` ;
91104 }
92105
93- set viewerPrefix ( value : string ) {
94- this . #viewerPrefix . set ( value ) ;
106+ set prefixViewer ( value : string ) {
107+ this . #viewerPrefixOverride . set ( value ) ;
95108 }
96109
97110 #runDiscovery( effect : Moq . Signals . Effect ) {
98111 const conn = effect . get ( this . connection . established ) ;
99112 if ( ! conn ) return ;
100113
101- const gamePrefix = effect . get ( this . #gamePrefix) ;
102- const viewerPrefix = effect . get ( this . #viewerPrefix) ;
114+ const base = effect . get ( this . #prefix) ;
115+ const gamePrefix = effect . get ( this . #gamePrefixOverride) ?? `${ base } /game` ;
116+ const viewerPrefix = effect . get ( this . #viewerPrefixOverride) ?? `${ base } /viewer` ;
103117 const prefix = Moq . Path . from ( gamePrefix ) ;
104118
105119 const announced = conn . announced ( prefix ) ;
0 commit comments