Skip to content

redis blocked: RedisClient's class-capture slot 7 (isolationPool) is never rebound, so js_class_capture_value returns undefined — indirect 'extends <expression>' cap-arg split, cf #5957 #10660

Description

@proggeramlug

Found by a package-compilability probe: redis (@redis/client) now compiles from real source but fails at
runtime
, and this is the single blocker.

Cannot read private member from an object whose class did not declare it

@redis/client's classes use JS private (#) fields. Something in Perry's class handling loses the association
between an instance and the class that declared its private fields, so a legitimate this.#x read on an instance
of the declaring class is rejected.

Note this is a correctness bug, not the known perf one. #10501 covers private members being ~1200× slower than
Node; this is separate — the read fails outright.

Why it matters

redis is one of the packages whose hand-written Rust native binding we intend to delete. The probe result is:
compiles ✓, runs ✗, and this error is the only thing standing between the two. Fixing it plausibly makes the
redis binding deletable.

Worth checking first

Several class-identity fixes landed or are in flight this cycle and may be adjacent — the private-field brand
check is exactly the kind of thing that would break if instance→class association is resolved by a shared or
stale id:

If the private-field brand check consults a class id rather than the pinned constructing class, that is the likely
mechanism and #10640's pin_instance_constructing_class is the tool.

Reproduce: npm i redis, a package.json with perry.compilePackages including redis, @redis/client and its
@redis/* siblings, then any client construction. The probe's harness is on perrymaster at
/root/claude-pkgaudit-measure/pkgtest/redis_test.ts.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    package-auditFound by the 2026 package audit: compiling real npm packages from source instead of native bindings

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions