A reactive programming library for JavaScript
RxJS is a library for composing asynchronous and event-based programs with Observable values. This repository contains the platform-based next generation of RxJS, planned for release as RxJS 9.
RxJS 9 is prerelease work in development. The planned first beta is
9.0.0-beta.0, but it has not been published to npm yet. Thenexttag still points to the earlier RxJS 8 prerelease, while RxJS 7 remains the productionlatestline and continues to be maintained.
RxJS 8 was real work, not a skipped release. Development began years ago and was paused while the Web Platform Observable proposal was finalized. The new implementation is a platform-based generation rather than a continuation of that paused RxJS 8 branch, so it starts at version 9 to make the architectural break unmistakable and avoid presenting the old RxJS 8 work as the released product.
Observable when one exists and installs
a conforming fallback only when needed.ColdObservable when each direct
subscription must create its own producer.AbortSignal and the platform Subscriber lifecycle.require() to the
same ESM files; there is no duplicate CommonJS build.The following example shows the planned beta API. Until 9.0.0-beta.0 is
published, do not use npm's next tag to install RxJS 9.
import { ColdObservable } from 'rxjs';
import { map } from 'rxjs/map';
const source = new ColdObservable<number>((subscriber) => {
subscriber.next(1);
subscriber.next(2);
subscriber.complete();
});
source[map]((value) => value * 2).subscribe(console.log);
Import the Symbol and call it with bracket syntax. A platform method such as
observable.map(project) remains the platform contract;
observable[map](project) is the separately versioned RxJS contract.
rxjs
Symbol extensions and intentional RxJS primitives
Package guide · API · RxJS 7 migration
@rxjs/observable-polyfill
Conditional platform Observable fallback
Package guide
@rxjs/test
Implementation-neutral virtual-time and marble testing
Package guide
@rxjs/migrate
Deterministic migration engine and canonical agent Skill
Package guide
Release support, budgets, and exact environment gates are documented in the
rxjs package. The irreversible npm
publication process is the public secure release runbook.
The RxJS 9 security-assurance document
explains the release evidence, verification commands, sole-maintainer model,
and OpenSSF Scorecard in context.
Repository-wide design records live in
docs/rxjs-next.
The planned beta supports Node 22.13+ and Node 24 as blocking lanes, with Node 26 in an advisory lane. Current Chrome, Firefox, desktop Safari, Mobile Safari, Deno, Bun, and Webpack 5 are blocking. Every supported consumer receives the same ESM implementation, so Deno and Bun support adds no runtime-specific package or application-bundle code.
Requires Node 22.13+ and pnpm 10.34.5. Run commands from the repository root.
pnpm install
pnpm --filter rxjs exec vitest --run src
pnpm --filter rxjs run test:package
pnpm run release:check
Start with the repository contribution guide and the
rxjs package contribution guide. The active
execution queue is PROJECT_PLAN.md.
The complete source-pinned RxJS 7 corpus intentionally retains reviewed lifecycle and compatibility divergences, so it is migration evidence rather than a blanket RxJS 9 compatibility gate. Focused source, package, runtime, browser, performance, and WPT commands are the release gates.
Polyfill refuses to initialize when AbortController is a subclass
[combineLatest] loses the tuple shape of array-literal sources, unlike [forkJoin]
ColdObservable.from(promise) never delivers a rejection to the subscriber
`observers` should be private on Subjects.
auditTime(0, animationFrameScheduler) stops emiting unexpectedly.
Ensure we're properly supporting ESM in Node
Standard compliant ES Modules format
Monorepo and Splitting Out To Different Packages