Contributing to rxjs
August 1, 2026 ยท View on GitHub
RxJS 9 is a platform-based generation, not an incremental RxJS 7 port. Before
changing source or public behavior, read the repository charter, architecture,
decisions, active project plan, open questions, and compatibility policy under
../../docs/rxjs-next.
Architectural rules
- Preserve a conforming native Observable; initialize the fallback only when the realm does not already supply one.
- Export exact, module-owned Symbols and install RxJS behavior only at those
keys. Do not add string-named RxJS methods or use
Symbol.forfor public operators. - Keep platform sharing semantics separate from
ColdObservableand other explicit producer-per-subscription contracts. - Base cancellation and teardown on
AbortSignaland Subscriber lifecycle. - Treat the source-pinned RxJS 7 corpus as classified migration evidence. Do not revive unsupported internals merely to turn an intentional divergence green.
- Update package-local documentation with public exports, lifecycle, distribution, or release-gate changes.
Fast checks
From the repository root:
pnpm --filter rxjs exec vitest --run src
pnpm --filter rxjs run test:types
pnpm --filter rxjs run test:package
pnpm run test:kernel
pnpm run release:check
Use pnpm --filter rxjs run test:watch for focused development. Run the
narrowest relevant browser, performance, or WPT gate for changes that affect
those contracts; the commands and exact matrix are in
docs/RELEASE_GATES.md.
The cold and fallback ported audits intentionally retain reviewed lifecycle and arbitrary-subscribable divergences. A raw nonzero all-mode result does not authorize weakening platform semantics or hiding cases behind skips.
Project-plan discipline
The active queue is ../../docs/rxjs-next/PROJECT_PLAN.md. Work on its sole
NEXT item unless the user changes priority or a small prerequisite is
required. Completion requires evidence and a session-log entry, not only a
source change.