NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #351 most downloaded on npm
Reactive Extensions for modern JavaScript
Last release 2 months ago
04 Aug 2026
Ships unpredictably
gaps range from 2 weeks to 1.4 years
Some releases are documented
notes for 17 of the last 60 stable releases
3 versions withdrawn
withdrawn after publishing
11 years old
167 releases · first in 2015
docs: remove duplicate deprecated note on retryWhen by @Smankusors in #7465
expand no longer supports a scheduler parameter by @benlesh in #7431every re-entrancy and signature. by @benlesh in #7432Full Changelog: 8.0.0-alpha.14...9.0.0-beta.0
One column per quarter.
rxjs: removed unnecessary peer deps
⚠️ Subject.create: Removed the deprecated Subject.create method.
Symbol.observable export (#4466, #7361)Subject.create method. (d62ce6ebe)Subject. (54f2f6ed1)toEqual (#7403)onStoppedNotification and onUnhandledError will now always async dispatch (#7344)fromEvent now handles symbols as event names (#7339)observable (the Symbol.observable symbol instance) is no longer exported. Use a polyfill like symbol-observable, or use Symbol.observable ?? '@@observable' as a workaround."Subject.create method. If you need to create an object that is "half Observable, half Observer", you'll need to either bolt next, error, and complete handlers onto an Observable and property type the return... or you'll need to create your own class that is backed by an Observable. In any case, if the Observer and the Observable are so unrelated that you have to bolt them together, you're probably better off with those two objects separately. This is why Subject.create has been deprecated for so long.WebSocketSubject is no longer instanceof Subject. Check for instanceof WebSocketSubject instead.chore(publish): 8.0.0-alpha.12
chore(publish): 8.0.0-alpha.12
chore(publish): 8.0.0-alpha.11
chore(publish): 8.0.0-alpha.11
chore(commit): 8.0.0-alpha.10
chore(commit): 8.0.0-alpha.10
chore(publish): 8.0.0-alpha.9
chore(publish): 8.0.0-alpha.9
chore(publish): 8.0.0-alpha.8
chore(publish): 8.0.0-alpha.8
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
buffer: closingNotifier now supports any ObservableInput
closingNotifier now supports any ObservableInput (#7073) (61b877a)delayWhen's delayDurationSelector now supports any ObservableInput (#7049) (dfd95db)compareTo now supports any ObservableInput (#7102) (d501961)ShareConfig factory properties now supports any ObservableInput (#7093) (cc3995a)notifier now supports any ObservableInput (#7091) (60d6c40)windowBoundaries now supports any ObservableInput (#7088) (8c4347c)distinct: flush argument now supports any ObservableInput
onErrorResumeNextWith: renamed onErrorResumeNext and exported from the top level. (onErrorResumeNext operator is stil available, but deprecated)
onErrorResumeNext and exported from the top level. (onErrorResumeNext operator is stil available, but deprecated) (#6755) (51e3b2c)share and connect no longer bundle scheduling code by default (#6873) (9948dc2), closes #6872require export condition (#6821) (c8955e4)bind functions passed with observers to subscribe. (#6815) (fb375a0), closes #6783unknown rather than any, which should resolve issues with eslint no-unsafe-argument (#6738) (67cb317), closes #6536Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
takeWhile: Now returns proper types when passed a Boolean constructor.
Boolean constructor. (#6633) (081ca2b)Add es2015 entries to the exports declaration to support Angular (#6614) (268777b), closes /github.com/ReactiveX/rxjs/pull/6613#discussion_r716958551
Nothing published for this version
Expose Connectable, the return type of connectable (#6531) (69f5bfa), closes #6529
From here on out, we encourage top-level imports with RxJS. Importing from rxjs/operators will be deprecated soon. (#6488) (512adc2), closes #6242
Observable teardowns now properly called if useDeprecatedSynchronousErrorHandling is true. (#6365) (e19e104), closes #6364
share, publish, publishReplay are now referentially transparent. Meaning if you take the result of calling publishReplay(3) and pass it to more than one observable's pipe method, it will behave the same in each case, rather than having a cumulative effect, which was a regression introduced sometime in version 6. If you required this broken behavior, there is a workaround posted here (#6410) (e2f2e51), closes /github.com/ReactiveX/rxjs/pull/6410#issuecomment-846087374 #5411observed property. This will allow users to check whether a subject has current subscribers without us allowing access to the observers array, which is going to be made private in future versions. (#6405) (f47425d)1. (#6359) (e797bd7)useDeprecatedSynchronousErrorHandling is true. (#6365) (e19e104), closes #6364Nothing published for this version
finalize behaves well with useDeprecatedSynchronousErrorHandling (#6251) (e4bed2a), closes #6250
instanceof AjaxError. (#6275) (a7c2d29)connectable, now takes a configuration object instead of just the Subject instance. This was necessary to make sure it covered all use cases for what we were trying to replace in the deprecated multicasting operators. Apologies for the late-in-the-game change, but we know it's not widely used yet (it's new in v7), and we want to get it right.webSocket: return the correct type for WebSocketSubject multiplex method
TypeScript: Add typesVersions definition to package.json in order to help VS Code find automatic imports.
symbol: revert unique symbol in #5874 (#6224) (3c49429), closes #5919 #6178 #6175
unknown is inferred for 9+ arguments. (#6212) (6fa819b)esm: duplicate directory in export path
share: No longer throws errors for reentrant observables (#6151) (fc728cd), closes #6144
params option in the request configuration (#6174) (980f4d4)from(readableStream). (#6163) (19d6502)fromEvent: throw if passed invalid target (#6136) (317ba0c), closes #5823
any will now behave property with findIndex (#6097) (c6f73d6)undefined as an argument, require an argument (4983760), closes #6064defaultValue of undefined. (5bc1b3e)defaultValue of undefined. (62a6bbe)defaultValue of undefined. (ef3e721)defaultIfEmpty requires a value be passed. Will no longer convert undefined to null for no good reason.5bc8e3361 Fix/6052 ajax responseType should default to "json"
5bc8e3361 Fix/6052 ajax responseType should default to "json" (#6056)
responseType is now properly defaulted to "json" again. (#6056) (5bc8e3361)take. (#6062) (a2b9563)Resolve issues with deprecated synchronous error handling and chained operators (#5980) (0ad2802), closes #5979
any will now behave property in TS (#5987) (f5ae97d), closes #5986publish variants returning ConnectableObservable not properly utilizing lift (#6003) (9acb950)useDeprecatedSynchronousErrorThrowing honored for flattened sync sources (#5984) (abd95ce), closes #5983exhaust to exhaustAll (#5639) (701c7d4)windowBoundaries observable no longer completes the result. It was only ever meant to notify of the window boundary. To get the same behavior as the old behavior, you would need to add an endWith and a skipLast(1) like so: source$.pipe(window(notifier$.pipe(endWith(true))), skipLast(1)).endWith and skipLast(1), like so: source$.pipe(buffer(notifier$.pipe(endWith(true))), skipLast(1))closingNotifier completion no longer completes the result of buffer. If that is truly a desired behavior, then you should use takeUntil. Something like: source$.pipe(buffer(notifier$), takeUntil(notifier$.pipe(ignoreElements(), endWith(true)))), where notifier$ is multicast, although there are many ways to compose this behavior.combineLatest: Ensure EMPTY is returned if no observables are passed. (#5963) (157c7e8), closes #5962
EMPTY is returned if no observables are passed. (#5963) (157c7e8), closes #5962connect operator. (9d53af0)connectable creation method (f968a79)share completely configurable. Also adds SubjectLike. (2d600c7)expectObservable(a$).toEqual(b$). (3372c72)Subscribable now only supports what is a valid return for [Symbol.observable]().Observer no longer incorrectly has an optional closed property.audit: don't signal on complete
forkJoin([a$, b$, c$] as const) result is correct (6baec53)unique symbol. (#5874) (374138e), closes #5861 #4415rxjs@7 is only compatible with @types/node@14.14.3 or higher and symbol-observable@3.0.0 and higher. Older versions of @types/node incorrectly defined Symbol.observable and will be in conflict with rxjs and symbol-observable@3.0.0.delayWhen will no longer emit if the duration selector simply completes without a value. Notifiers must notify with a value, not a completion.iif will no longer allow result arguments that are undefined. This was a bad call pattern that was likely an error in most cases. If for some reason you are relying on this behavior, simply substitute EMPTY in place of the undefined argument. This ensures that the behavior was intentional and desired, rather than the result of an accidental undefined argument.delayWhen: only deprecates when subscriptionDelay presents
from and others. (258dddd), closes #4532mergeScan will no longer emit its inner state again upon completion.pairs will no longer function in IE without a polyfill for Object.entries. pairs itself is also deprecated in favor of users just using from(Object.entries(obj)).zip([[1,2,3]]). But again, that's pretty weird.source observable as a third argument to the predicate. That feature was rarely used, and of limited value. The workaround is to simply close over the source inside of the function if you need to access it in there.…Subscriber.create and new Subscriber are both deprecated.
new Subscriber no longer takes 0-3 arguments. To create a Subscriber with 0-3 arguments, use Subscriber.create. However, please note that there is little to no reason that you should be creating Subscriber references directly, and Subscriber.create and new Subscriber are both deprecated.AsyncSubject: fixed reentrancy issue in complete (9e00f11), closes /github.com/ReactiveX/rxjs/pull/5729/files/30d429cf1b791db15c04a61f6a683e189b53fb3e
Date) passed as an argument (8ae89b1)skipLast will no longer error when passed a negative number, rather it will simply return the source, as though 0 was passed.thisArg will now default to undefined. The previous default of MapSubscriber never made any sense. This will only affect code that calls map with a function and references this like so: source.pipe(map(function () { console.log(this); })). There wasn't anything useful about doing this, so the breakage is expected to be very minimal. If anything we're no longer leaking an implementation detail.console.warn. This is potentially breaking in edge cases for node applications, which may be configured to terminate for unhandled exceptions. In the unlikely event this affects you, you can configure the behavior to console.warn in the new configuration setting like so: import { config } from 'rxjs'; config.onUnhandledError = (err) => console.warn(err);useDeprecatedNextContext: Puts deprecated next context behavior behind a flag
switchMap and exhaustMap behave correctly with re-entrant code. (c289688)add no longer returns unnecessary Subscription reference (#5656) (4de604e)remove will now remove any teardown by reference (#5659) (1531152)Object.create (40a9e77)ajax body serialization will now use default XHR behavior in all cases. If the body is a Blob, ArrayBuffer, any array buffer view (like a byte sequence, e.g. Uint8Array, etc), FormData, URLSearchParams, string, or ReadableStream, default handling is use. If the body is otherwise typeof "object", then it will be converted to JSON via JSON.stringify, and the Content-Type header will be set to application/json;charset=utf-8. All other types will emit an error.Content-Type header passed to ajax configuration no longer has any effect on the serialization behavior of the AJAX request.AjaxRequest is no longer the type that should be explicitly used to create an ajax. It is now AjaxConfig, although the two types are compatible, only AjaxConfig has progressSubscriber and createXHR.zip: zip operators will no longer iterate provided iterables "as needed", instead the iterables will be treated as push-streams just like they would be everywhere else in RxJS. This means that passing an endless iterable will result in the thread locking up, as it will endlessly try to read from that iterable. This puts us in-line with all other Rx implementations. To work around this, it is probably best to use map or some combination of map and zip. For example, zip(source$, iterator) could be source$.pipe(map(value => [value, iterator.next().value])).
Subscription: add no longer returns an unnecessary Subscription reference. This was done to prevent confusion caused by a legacy behavior. You can now add and remove functions and Subscriptions as teardowns to and from a Subscription using add and remove directly. Before this, remove only accepted subscriptions.
RxJS Error types Tests that are written with naive expectations against errors may fail now that errors have a proper stack property. In some testing frameworks, a deep equality check on two error instances will check the values in stack, which could be different.
Undocumented Behaviors/APIs Removed:
unsubscribe no longer available via the this context of observer functions. To reenable, set config.useDeprecatedNextContext = true on the rxjs config found at import { config } from 'rxjs';. Note that enabling this will result in a performance penalty for all consumer subscriptions._unsubscribeAndRecycle of Subscriber has been removed. Just use new Subscription objectsretry would result in an observable that repeats forever.repeat would result in an observable that repeats forever.sortActions method on VirtualTimeScheduler is no longer publicly exposed by our TS types.throwError: In an extreme corner case for usage, throwError is no longer able to emit a function as an error directly. If you need to push a function as an error, you will have to use the factory function to return the function like so: throwError(() => functionToEmit), in other words throwError(() => () => console.log('called later')).
ajax: Partial observers passed to progressSubscriber will no longer error
progressSubscriber will no longer error (25d279f)"json", we're in IE, and the responseType is not valid JSON, the ajax observable will no longer emit a syntax error, rather it will emit a full AjaxError with more details.lift no longer exposed. It was NEVER documented that end users of the library should be creating operators using lift. Lift has a variety of issues and was always an internal implementation detail of rxjs that might have been used by a few power users in the early days when it had the most value. The value of lift, originally, was that subclassed Observables would compose through all operators that implemented lift. The reality is that feature is not widely known, used, or supported, and it was never documented as it was very experimental when it was first added. Until the end of v7, lift will remain on Observable. Standard JavaScript users will notice no difference. However, TypeScript users might see complaints about lift not being a member of observable. To workaround this issue there are two things you can do: 1. Rewrite your operators as outlined in the documentation, such that they return new Observable. or 2. cast your observable as any and access lift that way. Method 1 is recommended if you do not want things to break when we move to version 8.perf: Ensure unsubscriptions/teardowns on internal subscribers are idempotent (#5465) (3e39749), closes #5464
lift no longer exposed. It was never documented that end users of the library should be creating operators using lift. Lift has a variety of issues and was always an internal implementation detail of rxjs that might have been used by a few power users in the early days when it had the most value. The value of lift, originally, was that subclassed Observables would compose through all operators that implemented lift. The reality is that feature is not widely known, used, or supported, and it was never documented as it was very experimental when it was first added. Until the end of v7, lift will remain on Observable. Standard JavaScript users will notice no difference. However, TypeScript users might see complaints about lift not being a member of observable. To workaround this issue there are two things you can do: 1. Rewrite your operators as outlined in the documentation, such that they return new Observable. or 2. cast your observable as any and access lift that way. It is recommended that operators be implemented in terms of functions that return (source: Observable<T>) => new Observable<R>(...), per the documentation/guide.dependencies: Move accidental dependency on typedoc to dev-dependencies.
pluck: operator breaks with null/undefined inputs.
() => undefined to observableFactory (#5449) (1ae937a), closes #5449single(() => false) on empty observables. (#5325) (27931bc), closes #5325race operator (#5303) (ca7f370)Notification.createNext(undefined) will no longer return the exact same reference every time.
Type signatures tightened up around Notification and dematerialize, may uncover issues with invalid types passed to those operators.
Experimental support for for await as been removed. Use https://github.com/benlesh/rxjs-for-await instead.
defer no longer allows factories to return void or undefined. All factories passed to defer must return a proper ObservableInput, such as Observable, Promise, et al. To get the same behavior as you may have relied on previously, return EMPTY or return of() from the factory.
single operator will now throw for scenarios where values coming in are either not present, or do not match the provided predicate. Error types have thrown have also been updated, please check documentation for changes.
take and will now throw runtime error for arguments that are negative or NaN, this includes non-TS calls like take().
takeLast now has runtime assertions that throw TypeErrors for invalid arguments. Calling takeLast without arguments or with an argument that is NaN will throw a TypeError
ReplaySubject no longer schedules emissions when a scheduler is provided. If you need that behavior,
please compose in observeOn using pipe, for example: new ReplaySubject(2, 3000).pipe(observeOn(asap))
timestamp operator accepts a TimestampProvider, which is any object with a now method
that returns a number. This means pulling in less code for the use of the timestamp operator. This may cause
issues with TestScheduler run mode. (Issue here: https://github.com/ReactiveX/rxjs/issues/5553)
startWith: startWith will return incorrect types when called with more than 7 arguments and a scheduler. Passing scheduler to startWith is deprecated
lastValueFrom and firstValueFrom methods (#5295) (e69b765)combineLatestWith - renamed legacy combineLatest operator (#5251) (6d7b146)zipWith which is just a rename of legacy zip operator (#5249) (86b6a27)startWith will return incorrect types when called with more than 7 arguments and a scheduler. Passing scheduler to startWith is deprecatedT | undefined in TypeScript, which is correct, but may break builds.chain subscriptions from observables that belong to other instances of RxJS (e.g. in node_modules)
shareReplay completion (#5044) (35e600f), closes #5034of: remove deprecation comment to prevent false positive warning
this (#4978) (7606dc7)frameTimeFactor property (#4977) (8c32ed0)as.asSchedulerLike may result in the wrong type which includes the SchedulerLike, even though the run time implementation does not support that. Developers should be using scheduled insteadrxjs/Rx is no longer a valid import site.rxjs-compat is not published for v7 (yet)race() will no longer subscribe to subsequent observables if a provided source synchronously errors or completes. This means side effects that might have occurred during subscription in those rare cases will no longer occur.Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →