Files
ArtPlayer/refactor/changes/2026-09-12-PKG-IFRAME-03-requests-checkpoint.md
T

5.4 KiB

PKG-IFRAME-03 request ownership checkpoint (doing)

The old single JS file is now a strict TS public entry plus a request ownership module. Entry methods and fields remain in place; the private WeakMap does not add reflective instance keys. Source types are checked by a new package tsconfig, without changing published declarations or installing dependencies. Package ARCHITECTURE.md explains state, ownership, compatibility and follow-up work.

Corrections and compatibility

Boundary Previous result Candidate result
Same millisecond / clock rollback Callbacks overwrite each other or old IDs recur Module-wide increasing numeric IDs preserve independent responses
Multiple instances, one frame Each instance can settle from the same response ID Instances from the same module allocate distinct IDs
Destroy sent/waiting request Sent promise hangs; waiting poll remains until its next tick Immediate rejection with the existing destroyed Error message, timers/registry released
Saved callback after destroy Can settle or notify Inert
Native send failure Immediate rejection leaks record; delayed failure escapes callback Same original error rejects in both paths, all owned state removed
Public resove/reject Promise settles but its registry entry remains Promise and corresponding owned registry entry released once
Inherited response ID toString can be mistaken for a request and throws Only own registry entries participate, generic message callback still runs

These are deliberate fixes under API-02/03/04/05/12, not a new wire format. Constructor validation, seven field descriptors/order, bound onMessage, callback receiver/packet shape, numeric envelopes, resove, ordinary registry identity, wildcard target origin, 200ms polling, generic non-error responses, function-body commit serialization, child sync/resolve timing and child error channel remain. An ID is now a correlation number rather than an exact clock reading. Callers must handle pending request rejection on destroy; old promises hung indefinitely. No automatic timeout, new public option, SDK or version change is introduced.

The counter is local to a library module; separately evaluated copies are not coordinated. Source typing uses any only for the existing arbitrary message payload/callback/result boundary; ownership and state are explicit. The child error .message assertion intentionally retains the old error serialization, including its existing behavior for unusual thrown values. The contentWindow assertion does not add an availability guarantee: a null window throws inside the send boundary and rejects the request rather than leaving it owned.

Validation

The same 16 candidate Node assertions against the frozen workspace pass 5 and fail 11; candidate source passes all 16. The unchanged candidate browser checks against that old artifact pass 2 round trips and fail 8 lifecycle cases across same/cross-origin Chromium. Full failure reports/results/traces are archived in refactor/.cache/iframe03-before-results; Node log is iframe03-before-node.log. This contrasts candidate acceptance with the separate historical defect assertions.

During the independent diff review, the new own-property guard was found to throw for consumer-cleared promises[id] = undefined, whereas the old workspace ignored it. iframe03-empty-record-before.log records that old/current contrast. The guard now retains the old truthiness check as well; the existing regression case covers this edge. Earlier passing CI/browser records predate this fix and remain archived; final candidate builds and checks are rerun against the new bytes.

Final production/browser/CI results and hashes are recorded in the checkpoint validation file after execution. No player is created by these iframe-only fixtures; they do not establish full demo/core/media integration.

Remaining work and rollback

PKG-IFRAME-03 remains doing. Navigation/reinjection, malformed packets, constructor setup failure cleanup and the independent source/origin policy still need work. IFRAME-LIFE-01, IFRAME-TRUST-01 and IFRAME-DIST-01 remain open. Trust policy has not silently changed; current foreign-message behavior is still a known defect. PKG-IFRAME-04 owns declaration/helper/old-name compatibility and 05/06 own complete integration/distribution. This checkpoint is not release acceptance.

Rollback by reverting this checkpoint and rebuilding artplayer-tool-iframe through the normal script. The frozen artifacts and previous evidence remain immutable. Commit subject: fix(iframe): [PKG-IFRAME-03] own pending requests and cancellation.

Final source/main/legacy Node checks each pass 16. Final main browser matrix passes 174 (144 historical defect assertions + 30 candidate acceptance), and final legacy passes 30 candidate rows. All three engines execute real windows; there are no skips/capability substitutes. CI passes 1505 (1331 unit + 14 engineering + 160 baseline), 44 repeated contracts and 326 production TS files; 3 import/SSR files pass after the final rebuild. All hashes match archived reports and the final source/artifacts; docs copies are byte-identical.

One normal build attempt failed copying the legacy file into docs with Windows copyfile UNKNOWN; the cause is not established. The failure log is retained, and a normal build rerun succeeded before final checks. No manual artifact edit or ignored build failure was used. Status stays doing and all three risks open.