ReactiveX/rxjs · error · Error

Scheduler-backed publishReplay is not supported by this Symb

Error message

Scheduler-backed publishReplay is not supported by this Symbol contract.

What it means

publishReplay in RxJS Next drops scheduler support. If the 5th positional argument (scheduler) is not undefined, or the 4th argument (selectorOrScheduler) is supplied but is not a function (i.e. it's a legacy scheduler object), it throws the scheduler error.

Source

Thrown at packages/rxjs/src/publish-replay.ts:40

    [publishReplay](
      bufferSize: number | undefined,
      windowTime: number | undefined,
      selector: undefined,
      scheduler: PublishReplayTimestampProvider
    ): ConnectableObservable<T>;
    [publishReplay](bufferSize?: number, windowTime?: number, scheduler?: PublishReplayTimestampProvider): ConnectableObservable<T>;
  }
}

Observable.prototype[publishReplay] = function <T, Selected extends ObservableValue<unknown>>(
  this: Observable<T>,
  bufferSize?: number,
  windowTime?: number,
  selectorOrScheduler?: ((shared: Observable<T>) => Selected) | unknown,
  scheduler?: unknown
): ConnectableObservable<T> | Observable<ObservedValueOf<Selected>> {
  if (scheduler !== undefined) {
    throw new Error(SCHEDULER_ERROR);
  }

  const selector = typeof selectorOrScheduler === 'function' ? (selectorOrScheduler as (shared: Observable<T>) => Selected) : undefined;
  if (selectorOrScheduler !== undefined && !selector) {
    throw new Error(SCHEDULER_ERROR);
  }

  const subject = replaySubject<T>({
    size: bufferSize,
    maxAge: windowTime,
  });

  if (selector) {
    return this[multicast](subject, selector);
  }

  // RxJS 7 retains one ReplaySubject for the lifetime of every publishReplay
  // result, including selector-form results that are later retried or repeated.

View on GitHub (pinned to 54796b38a5)

Solutions

  1. Remove the scheduler argument; accept synchronous replay buffering
  2. Use bufferSize/windowTime only: obs[publishReplay](3, 500)
  3. For testing timing, wrap the result in TestScheduler marble tests instead of an inline scheduler

Example fix

// before
source[publishReplay](3, 500, undefined, asyncScheduler);
// after
source[publishReplay](3, 500);
Defensive patterns

Strategy: validation

Validate before calling

if (arguments.length > 3) throw new TypeError('scheduler not supported');
obs[publishReplay](bufferSize, windowTime, selector);

Prevention

When it happens

Trigger: obs[publishReplay](3, 500, undefined, asyncScheduler) or obs[publishReplay](3, 500, someSchedulerObject) where the 4th arg isn't a selector function.

Common situations: RxJS 7 code that scheduled replay emission with a scheduler running unchanged; passing null/undefined slots plus a scheduler positionally.

Related errors


AI-assisted analysis of ReactiveX/rxjs@54796b38a5 (2026-08-28). Data as JSON: /api/errors/b6d38a6ecc5e4a19. Report an issue: GitHub.