angular/components · error · Error

Player not initialized before ${name} called

Error message

Player not initialized before ${name} called

What it means

The fake YouTube player (used for testing/offline rendering) stores event handlers that dispatch to registered listeners. Its eventHandlerFactory checks that playerConfig has been set; invoking any event (e.g. onStateChange, onReady) before the player was initialized throws `Player not initialized before ${name} called`.

Source

Thrown at src/youtube-player/fake-youtube-player.ts:95

    return playerSpy;
  });

  playerSpy.addEventListener.and.callFake((name, listener) => {
    const store: ListenersStore<typeof name> = boundListeners;
    if (!store[name]) {
      store[name] = new Set();
    }
    store[name].add(listener);
  });

  playerSpy.removeEventListener.and.callFake((name, listener) => {
    boundListeners[name]?.delete(listener);
  });

  function eventHandlerFactory<EventName extends keyof YT.Events>(name: EventName) {
    return (arg = {} as ListenerArg<EventName>) => {
      if (!playerConfig) {
        throw new Error(`Player not initialized before ${name} called`);
      }

      boundListeners[name]?.forEach(callback =>
        (callback as (arg: ListenerArg<EventName>) => void)(arg),
      );
    };
  }

  const events: Required<YT.Events> = {
    onReady: eventHandlerFactory('onReady'),
    onStateChange: eventHandlerFactory('onStateChange'),
    onPlaybackQualityChange: eventHandlerFactory('onPlaybackQualityChange'),
    onPlaybackRateChange: eventHandlerFactory('onPlaybackRateChange'),
    onError: eventHandlerFactory('onError'),
    onApiChange: eventHandlerFactory('onApiChange'),
    onAutoplayBlocked: eventHandlerFactory('onAutoplayBlocked'),
  };

View on GitHub (pinned to 0411926e7d)

Solutions

  1. Await player initialization (the promise from the player factory / onReady) before firing or relying on events
  2. In tests, ensure setup triggers init before dispatching events (e.g. flush microtasks / await fixture.whenStable)
  3. Recreate the fake player if a previous init failed and left playerConfig unset

Example fix

// before
player.addEventListener('onStateChange', handler);
fireEvent('onStateChange'); // throws: playerConfig undefined

// after
await player.init(); // ensures playerConfig is set
player.addEventListener('onStateChange', handler);
fireEvent('onStateChange');
Defensive patterns

Strategy: validation

Validate before calling

// Ensure init before firing events in tests
function assertInitialized(p: {playerConfig?: unknown}): void {
  if (!p.playerConfig) throw new Error('Init fake player before dispatching events');
}
// usage
await fakePlayer.init();
assertInitialized(fakePlayer);
fireEvent('onStateChange');

Type guard

function isInitialized(p: {playerConfig?: unknown}): p is {playerConfig: object} {
  return p.playerConfig != null;
}

Try / catch

try {
  fakePlayer.fireEvent('onStateChange');
} catch (e) {
  if (String(e?.message).startsWith('Player not initialized')) {
    await fakePlayer.init();
    fakePlayer.fireEvent('onStateChange');
  }
}

Prevention

When it happens

Trigger: Emitting a fake player event before createPlayer()/initialization populated playerConfig — e.g. tests firing events, or addEventListener callbacks invoked during setup before init completes.

Common situations: Unit tests that trigger events synchronously before awaiting player creation; mocking the YT iframe API where load completes after listeners already fired; fake player reused across tests with stale state.

Related errors


AI-assisted analysis of angular/components@0411926e7d (2026-08-31). Data as JSON: /api/errors/df62213a1a30480b. Report an issue: GitHub.