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 1 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
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
One column per quarter.
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
combineLatest: deprecated rest argument and scheduler signatures (#4641) (6661c79), closes #4640
fromFetch static observable creation method from rxjs/fetch. Mirrors native fetch only it's lazy and cancellable via Observable interface. (#4702) (5a1ef86)partition observable creation function. Old partition operator is deprecated (#4419) (#4685) (d5d6980)scheduled creation function to use to create scheduled observable of values. Deprecate scheduled versions of from, range, et al. (#4595) (f57e1fc)subscribe: Deprecate null starting parameter signatures for subscribe
operators twice (#4310) (2399f6e)refCount when all resulting subscriptions have unsubscribed. The default behavior is to leave the source subscription running.inclusive option to the operator which causes to emit final value (#4115) (6e7f407)instanceof to avoid megamorphic LoadIC (#4499) (065b4e3)<a name="6.3.3"></a>
<a name="6.3.2"></a>
<a name="6.3.1"></a>
<a name="6.3.0"></a>
Nothing published for this version
Nothing published for this version
Nothing published for this version
forEach: deprecating passing promise constructor
<a name="6.2.2"></a>
<a name="6.2.1"></a>
<a name="6.2.0"></a>
Nothing published for this version
Nothing published for this version
ajax: Handle timeouts as errors
<a name="6.1.0"></a>
audit: will not crash if duration is synchronous (#3608) (76b7e27), closes #2743
websocket: no longer throws errors in operators applied to it
webSocket again, just like it was in 5.0. Now you should import from rxjs/webSocket<a name="6.0.0-uncanny-rc.7"></a>
interop: functions with [Symbol.observable] on them will now be accepted in operators like mergeMap, from, etc
[Symbol.observable] on them will now be accepted in operators like mergeMap, from, etc (#3562) (c9570df)dom lib (#3566) (8b33ee2)<a name="6.0.0-ucandoit-rc.6"></a>
migrations: make sure collection.json is present
migrations: deploy compiled JS rather than just the TS files.
<a name="6.0.0-turbo-rc.4"></a>
groupBy: reexporting the GroupedObservable type (#3556) (12d4933), closes #3551
schematics: add migration schematics for schematics users
<a name="6.0.0-tenacious-rc.2"></a>
compat: fix first & last operators so undefined arguments won't create empty values
compat: deprecate Observable.if/throw
Why "tactical"? Because I TOTALLY MEANT to ruin the release names by publishing an amazingly funny April Fool's joke about smooshMap. So this was "tactical". Super tactical. So very tactical.
<a name="6.0.0-rc.0"></a>
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
ajax: properly encode body with form data that includes URLs (#3502) (4455d21), closes #2399
<a name="6.0.0-beta.4"></a>
bindCallback: add better type overloads
serializer: x => x like so: websocket({ url, serializer: x => x })<a name="6.0.0-beta.3"></a>
build: update build-optimizer and point to correct sources
<a name="6.0.0-beta.2"></a>
build: update build-optimizer and point to correct sources
config.useDeprecatedSynchronousErrorThrowing: reentrant error throwing no longer trapped (#3449) (0892a2d), closes #3161
<a name="6.0.0-beta.0"></a>
deprecated-error-handling-warning: add console warning when code sets the flag to bad mode
never function (#3386) (53debc8)crossDomain flag in the config.source.mergeMap(x => of(x + x).pipe(map(y => y + x)) (the pattern would be the same for concatMap).NEVER constant instead.map instead: bindCallback(fn1, fn2)() becomes bindCallback(fn1)().pipe(map(fn2))rxjs/Rx is no longer available. Upcoming backwards compat solution will allow thatSymbol.iterator. That would be done by a proper polyfilling libraryObservable.if will have to cast Observable as any to get to if. It is a better idea to just use iif directly via import { iif } from 'rxjs';map instead: bindNodeCallback(fn1, fn2)() becomes bindNodeCallback(fn1)().pipe(map(fn2))map instead: fromEvent(target, 'click', fn) becomes fromEvent(target, 'click').pipe(map(fn))resultSelector argument. To get this same functionality, use map.resultSelector argument. The same functionality can be achieved by simply mapping either before or after first depending on your use case.resultSelector no longer supported, to get this functionality use: source.pipe(exhaustMap(x => of(x + x).pipe(map(y => x + y))))switchMap and switchMapTo no longer take resultSelector arguments, to get the same functionality use switchMap and map in combination: source.pipe(switchMap(x => of(x + x).pipe(y => x + y))).mergeMapTo no longer accepts a resultSelector, to get this functionality, you'll want to use mergeMap and map together: source.pipe(mergeMap(() => inner).pipe(map(y => x + y)))map instead: fromEventPattern(fn1, fn2, fn3) becomes fromEventPattern(fn1, fn2).pipe(map(fn3))<a name="6.0.0-alpha.4"></a>
ESM: Add [operators|ajax|websocket|testing]/package.json for ESM support, fixes #3227
never function (#3386) (53debc8)source.mergeMap(x => of(x + x).pipe(map(y => y + x)) (the pattern would be the same for concatMap).map instead: bindCallback(fn1, fn2)() becomes bindCallback(fn1)().pipe(map(fn2))rxjs/Rx is no longer available. Upcoming backwards compat solution will allow thatSymbol.iterator. That would be done by a proper polyfilling libraryObservable.if will have to cast Observable as any to get to if. It is a better idea to just use iif directly via import { iif } from 'rxjs';map instead: bindNodeCallback(fn1, fn2)() becomes bindNodeCallback(fn1)().pipe(map(fn2))NEVER constant instead.map instead: fromEvent(target, 'click', fn) becomes fromEvent(target, 'click').pipe(map(fn))resultSelector argument. To get this same functionality, use map.resultSelector argument. The same functionality can be achieved by simply mapping either before or after first depending on your use case.resultSelector no longer supported, to get this functionality use: source.pipe(exhaustMap(x => of(x + x).pipe(map(y => x + y))))switchMap and switchMapTo no longer take resultSelector arguments, to get the same functionality use switchMap and map in combination: source.pipe(switchMap(x => of(x + x).pipe(y => x + y))).mergeMapTo no longer accepts a resultSelector, to get this functionality, you'll want to use mergeMap and map together: source.pipe(mergeMap(() => inner).pipe(map(y => x + y)))map instead: fromEventPattern(fn1, fn2, fn3) becomes fromEventPattern(fn1, fn2).pipe(map(fn3))<a name="6.0.0-alpha.3"></a>
animationFrame.spec: spec description fix
rxjs/create items are now exported from rxjsempty() without a scheduler will return the same
instance every time.empty() no longer accepts a generic
argument, as it returns Observable<never>never() always returns the same instancenever() is now Observable<never> and the function no longer requires a generic type.<a name="6.0.0-alpha.2"></a>
build: properly outputs subdirectories like rxjs/operators
rxjs/operators (34fe560)<a name="6.0.0-alpha.1"></a>
Revert "fix(scheduler): prevent unwanted clearInterval (#3044)"
rxjs/create exports (c9963bd)rxjs/ajax (e971c93)internal directory (7342401)noop and identity from rxjs (810c4d0)Notification from rxjs (8809b48)rxjs (abd3b61)pipe utility function from rxjs (4574310)rxjs/operators (b1f8bfe)rxjs/websocket (5ac62c0)webSocket creator function now exported from rxjs/websocket as websocket.isArray are now hidden under rxjs/internal, they are implementation details and should not be used.HotObservable and ColdObservable, and other testing support types are no longer exported directly.of, from, combineLatest and fromEvent should now be imported from rxjs/create.rxjs/interfaces, import them from rxjs insteadrxjs/symbol/observable please use Symbol.observable and Symbol.iterator (polyfills may be required)rxjs/Observable, rxjs/Subject, rxjs/ReplaySubject, et al. All imports should be done directly from rxjs, for example: import \{ Observable, Subject \} from 'rxjs';Scheduler, (e.g. asap -> asapScheduler)rxjs
like so: import { map, filter, switchMap } from 'rxjs/operators';. No deep imports.rxjs/ajax.ArrayObservable or ForkJoinObservable._throw is now exported as throwErrorif is now exported as iifrxjs/operator/* will no longer work. Again, pipe operators are still where they were.distinct requires a Set implementation and must be polyfilled in older runtimesgroupByObject.setPrototypeOfmerge, concat, zip, onErrorResumeNext, and race have been
removed. Please use the static versions of those operations. e.g.
a.pipe(concat(b, c)) becomes concat(a, b, c).<a name="5.5.6"></a>
<a name="5.5.5"></a>
<a name="5.5.4"></a>
<a name="5.5.3"></a>
<a name="5.5.2"></a>
zip and combineLatest are properly inferred. (b8e6cf8)<a name="5.5.1"></a>
module and es2015 keys to avoid resolution conflicts (5073139)<a name="5.5.0"></a>
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
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
Your coding agent can read these notes before it upgrades. Set up the MCP server →