Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions docs/rxjs-next/COMPATIBILITY.md
Original file line number Diff line number Diff line change
Expand Up @@ -400,10 +400,12 @@ whether the RxJS form delegates, which additional functionality it supplies,
and which behavior or types intentionally differ. It must also prove that
installing the Symbol does not alter the platform method.

The P2.4 `map` pilot is the first recorded overlap. `observable[map](project,
thisArg?)` owns an RxJS projection index and optional callback receiver,
constructs through the RxJS `[create]` protocol, and participates in the
platform layer's shared activation lifecycle. It does not delegate to
The P2.4 `map` pilot is the first recorded overlap. `observable[map](project)`
owns an RxJS projection index, constructs through the RxJS `[create]` protocol,
and participates in the platform layer's shared activation lifecycle. D-059
removes the inherited RxJS 7 callback-receiver argument from this and every
other RxJS Next callback API; migration uses a closure or
`Function.prototype.bind`. The Symbol form does not delegate to
`observable.map(project)`, and installing it leaves that platform-owned string
method unchanged. Focused and native/fallback kernel tests cover both the
additional Symbol behavior and non-interference.
Expand Down
24 changes: 23 additions & 1 deletion docs/rxjs-next/DECISIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,7 @@ Status meanings:

## D-023 — Keep RxJS map and filter overloads on exact Symbol keys

- **Status:** Accepted
- **Status:** Superseded by D-059
- **Decision:** The RxJS `map` and `filter` contracts are installed only under
their exported exact Symbol keys. Their RxJS forms preserve the projection
or predicate index and optional `thisArg`; `filter` also preserves Boolean
Expand All @@ -492,6 +492,10 @@ Status meanings:
distinction for `filter`. Projection and predicate errors terminate the
shared operator activation. Concurrent observers share one upstream
activation and one index sequence under the platform lifecycle.
- **Reason superseded:** RxJS Next removes callback `thisArg` parameters rather
than carrying this RxJS 7 convenience into the new API. Closures and
`Function.prototype.bind` express the same receiver capture without forcing
every operator notification through `Function.prototype.call`.

## D-024 — Let finite take cancel synchronous upstream work before its limit

Expand Down Expand Up @@ -1491,3 +1495,21 @@ Status meanings:
operational and bootstrap costs for the current sole-maintainer release.
- **Scope:** Stable `9.0.0`, promotion to `latest`, and future reconsideration
of registry-supported trusted publishing remain separate decisions.

## D-059 — Remove callback `thisArg` parameters from RxJS Next

- **Status:** Accepted
- **Decision:** RxJS Next callback APIs do not accept a separate `thisArg`.
Remove the parameter and receiver-aware overloads from Symbol-keyed `every`,
`filter`, `find`, `findIndex`, `map`, and static `partition`. Invoke their
predicates and projectors directly.
- **Rationale:** A closure or `Function.prototype.bind` expresses an intentional
receiver at the call site. Retaining `thisArg` forces RxJS to dispatch every
value through `.call`, adding API and hot-path implementation cost for a
redundant convenience inherited from RxJS 7.
- **Consequence:** Migration must rewrite a second callback-receiver argument
to a closure or bound function. The callback value/index/source arguments,
type-guard and Boolean-constructor overloads, cancellation, result
construction, and platform string-named methods are unchanged. Historical
RxJS 7 evidence retains its source identity, while active migrated specs use
closures or bound functions instead of asserting the removed overload.
15 changes: 8 additions & 7 deletions docs/rxjs-next/OPEN_QUESTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,14 @@ Decide per overlapping operator:
- documentation that prevents false parity claims;
- native and fallback evidence that the platform method remains untouched.

P2.4 settles the pilot `map` case. The exact RxJS Symbol form supplies the
RxJS projection index and optional `thisArg`, constructs through `[create]`,
and follows the platform layer's shared activation contract. It does not
delegate to or replace the string-named platform `map`; native and fallback
kernel evidence verifies that the original method and descriptor remain
unchanged. Other overlapping operators still require the same per-capability
record before they are restored.
P2.4 settled the pilot `map` overlap and D-059 later removed its inherited
RxJS 7 callback-receiver argument. The exact RxJS Symbol form supplies the
RxJS projection index, constructs through `[create]`, and follows the platform
layer's shared activation contract. It does not delegate to or replace the
string-named platform `map`; native and fallback kernel evidence verifies that
the original method and descriptor remain unchanged. Other overlapping
operators still require the same per-capability record before they are
restored.

### 6. What is the canonical extension implementation pattern?

Expand Down
60 changes: 57 additions & 3 deletions docs/rxjs-next/PROJECT_PLAN.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,11 @@ wrappers in favor of direct D-037 `[create]` calls and recorded a further
bundle-size reduction. P6.8 completed durable pull-request and `master` CI
ownership for every accepted RxJS 9 test and release check. P6.9 implemented
truthful status signals and security automation and validated their first live
GitHub results. The user has now prioritized P6.10: one understandable,
interactive single-maintainer beta publication command with npm two-factor
authentication and no CI publishing credential.
GitHub results. The user then explicitly prioritized P6.11, which removed
inherited callback `thisArg` parameters and their hot-path dispatch cost. P6.10
remains the sole `NEXT` item: one understandable, interactive single-maintainer
beta publication command with npm two-factor authentication and no CI
publishing credential.

RxJS 9 and `9.0.0-beta.0` are selected under D-007. D-053 defines runtime,
browser, bundler, channel, and RxJS 7 maintenance policy. Dates and staffing
Expand Down Expand Up @@ -1569,6 +1571,7 @@ names.
| `DONE` | P6.8 | Complete RxJS 9 CI coverage and validate the resulting pull-request workflow matrix |
| `DONE` | P6.9 | Validate the first live dependency-review and Scorecard runs on GitHub |
| `NEXT` | P6.10 | Publish and verify the first beta with the interactive release command |
| `DONE` | P6.11 | Remove inherited callback `thisArg` parameters and direct-call callback hot paths |

#### P6.9 completion bar

Expand Down Expand Up @@ -1647,6 +1650,41 @@ review`. This completes P6.9; the later P6.10 ruleset migration must preserve
OTP/WebAuthn publication, package-access hardening, registry verification,
and the immutable GitHub Release remain required before `DONE`.

#### P6.11 completion bar

- Every RxJS Next callback API is audited for a separate `thisArg`; the exact
affected API inventory is recorded.
- Receiver-aware overloads, implementation parameters, and `.call` dispatch
are removed from all affected APIs without changing platform-polyfill
receiver binding required by Web IDL and iterator protocols.
- Focused and migrated tests no longer assert library-provided callback
receivers; source-pinned RxJS 7 identifiers remain historical evidence, and
active replacements demonstrate closures or `Function.prototype.bind`.
- Focused source, migrated cold/polyfill, public type, package, kernel,
migration-document freshness, lint, and diff gates pass.

#### P6.11 completion evidence

- Audited RxJS production source and found exactly six APIs with a separate
callback receiver argument: Symbol-keyed `every`, `filter`, `find`,
`findIndex`, and `map`, plus static Symbol-keyed `partition`. Removed every
receiver-aware overload, implementation parameter, and callback `.call`.
- Replaced active receiver assertions with ordinary value/index/source tests,
closures, or explicitly bound callbacks. Added public declaration checks
that reject the removed second or third arguments. Classified all six
source-pinned RxJS 7 cases as intentional divergences and made their
executable migrated programs bind callbacks instead of exercising the
removed overload.
- Passed all 750 RxJS source tests, the 76 affected cold and 76 affected
polyfill migrated tests, lint with zero errors, public types, package build,
migration-document freshness, 97-Symbol installation, and all package import
fixtures. Exact complete audits retained the reviewed 2,299/39 cold and
2,316/22 polyfill outcomes.
- Passed the eight-case packaged fallback/native Chrome 150 kernel contract.
The release performance gate measured approximately 63.0 million map values
and 140,627 cancellations per second. Marked P6.11 `DONE`; the completed
execution queue has no `NEXT` marker.

#### P6.1 completion bar

- All release packages share the accepted RxJS 9 prerelease identity and exact
Expand Down Expand Up @@ -3680,3 +3718,19 @@ conformance implementation depends on a runnable harness.
remains the sole `NEXT` item until the command publishes and verifies
`9.0.0-beta.0`, package access disallows automation tokens, and the immutable
GitHub Release is recorded.
### 2026-08-05 — P6.11 callback receiver removal

- Audited the complete RxJS production source and removed callback `thisArg`
overloads and `.call` dispatch from `every`, `filter`, `find`, `findIndex`,
`map`, and `partition`; no platform-polyfill protocol receiver binding was
changed.
- Reworked focused and migrated tests to use ordinary closures or bound
callbacks, added negative public-type assertions, and classified the six
source-pinned RxJS 7 receiver cases as intentional divergences while
preserving their historical IDs.
- Passed 750 source tests, both 76-test affected migrated suites, exact complete
cold/polyfill audit baselines, public types, lint, package/build/import and
migration freshness gates, the packaged fallback/native Chrome kernel, and
the release performance floor.
- Recorded D-059, marked P6.11 `DONE`, and retained P6.10 as the sole `NEXT`
item.
Loading
Loading