{"record":{"id":"b6d38a6ecc5e4a19","repo":"ReactiveX/rxjs","slug":"scheduler-backed-publishreplay-is-not-supported-by","errorCode":null,"errorMessage":"Scheduler-backed publishReplay is not supported by this Symbol contract.","messagePattern":"Scheduler-backed publishReplay is not supported by this Symbol contract\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/rxjs/src/publish-replay.ts","lineNumber":40,"sourceCode":"    [publishReplay](\n      bufferSize: number | undefined,\n      windowTime: number | undefined,\n      selector: undefined,\n      scheduler: PublishReplayTimestampProvider\n    ): ConnectableObservable<T>;\n    [publishReplay](bufferSize?: number, windowTime?: number, scheduler?: PublishReplayTimestampProvider): ConnectableObservable<T>;\n  }\n}\n\nObservable.prototype[publishReplay] = function <T, Selected extends ObservableValue<unknown>>(\n  this: Observable<T>,\n  bufferSize?: number,\n  windowTime?: number,\n  selectorOrScheduler?: ((shared: Observable<T>) => Selected) | unknown,\n  scheduler?: unknown\n): ConnectableObservable<T> | Observable<ObservedValueOf<Selected>> {\n  if (scheduler !== undefined) {\n    throw new Error(SCHEDULER_ERROR);\n  }\n\n  const selector = typeof selectorOrScheduler === 'function' ? (selectorOrScheduler as (shared: Observable<T>) => Selected) : undefined;\n  if (selectorOrScheduler !== undefined && !selector) {\n    throw new Error(SCHEDULER_ERROR);\n  }\n\n  const subject = replaySubject<T>({\n    size: bufferSize,\n    maxAge: windowTime,\n  });\n\n  if (selector) {\n    return this[multicast](subject, selector);\n  }\n\n  // RxJS 7 retains one ReplaySubject for the lifetime of every publishReplay\n  // result, including selector-form results that are later retried or repeated.","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/ReactiveX/rxjs/blob/54796b38a57e6309f9861e174737479bb3f63f61/packages/rxjs/src/publish-replay.ts#L22-L58","documentation":"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.","triggerScenarios":"obs[publishReplay](3, 500, undefined, asyncScheduler) or obs[publishReplay](3, 500, someSchedulerObject) where the 4th arg isn't a selector function.","commonSituations":"RxJS 7 code that scheduled replay emission with a scheduler running unchanged; passing null/undefined slots plus a scheduler positionally.","solutions":["Remove the scheduler argument; accept synchronous replay buffering","Use bufferSize/windowTime only: obs[publishReplay](3, 500)","For testing timing, wrap the result in TestScheduler marble tests instead of an inline scheduler"],"exampleFix":"// before\nsource[publishReplay](3, 500, undefined, asyncScheduler);\n// after\nsource[publishReplay](3, 500);","handlingStrategy":"validation","validationCode":"if (arguments.length > 3) throw new TypeError('scheduler not supported');\nobs[publishReplay](bufferSize, windowTime, selector);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Remove scheduler arguments before migrating to RxJS Next","Prefer shareReplay config for replay semantics"],"tags":["publish-replay","scheduler","rxjs-next","migration","removed-api"],"backgroundTag":"removed-scheduler-argument","analyzedSha":"54796b38a57e6309f9861e174737479bb3f63f61","analyzedAt":"2026-08-28T10:21:27.410Z","schemaVersion":2},"datasetVersion":"2026-08-28T11:17:15.048Z"}