From 82cfc8afa79e0e8b0dd5b6c6332c167e4fa9db6e Mon Sep 17 00:00:00 2001 From: MO Thibault <103271673+MO-Thibault@users.noreply.github.com> Date: Mon, 18 May 2026 14:40:42 -0400 Subject: [PATCH] fix(rtd): use property descriptors for Proxy-safe EID merging Prebid.js wraps ortb2Fragments in Proxies whose get trap blocks direct reads of `eids`. Replace direct property access in merge() with Object.getOwnPropertyDescriptor for reads and Object.defineProperty for writes to bypass Proxy traps. Co-Authored-By: Claude Opus 4.6 (1M context) --- lib/core/prebid/rtd.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/core/prebid/rtd.ts b/lib/core/prebid/rtd.ts index cd9f350..5f219c3 100644 --- a/lib/core/prebid/rtd.ts +++ b/lib/core/prebid/rtd.ts @@ -249,8 +249,12 @@ function merge(config: RTDConfig, targetORTB2: ORTB2, sourceORTB2: ORTB2): numbe /* eslint-disable no-param-reassign */ targetORTB2.user = targetORTB2.user ?? {}; targetORTB2.user.ext = targetORTB2.user.ext ?? {}; - targetORTB2.user.ext.eids = targetORTB2.user.ext.eids ?? []; /* eslint-enable no-param-reassign */ + + // Use Object.getOwnPropertyDescriptor/defineProperty to bypass Prebid's ORTB2 + // Proxy whose get trap blocks direct reads of `eids`. + const eidsDesc = Object.getOwnPropertyDescriptor(targetORTB2.user.ext, "eids"); + let currentEids: EID[] = Array.isArray(eidsDesc?.value) ? eidsDesc.value : []; let skipped = 0; const eidsBySource = @@ -267,8 +271,14 @@ function merge(config: RTDConfig, targetORTB2: ORTB2, sourceORTB2: ORTB2): numbe } const mergeFn = mergeStrategy(config, eidSource); - // eslint-disable-next-line no-param-reassign - targetORTB2.user!.ext!.eids = mergeFn(targetORTB2.user!.ext!.eids!, eids); + currentEids = mergeFn(currentEids, eids); + }); + + Object.defineProperty(targetORTB2.user!.ext!, "eids", { + value: currentEids, + writable: true, + enumerable: true, + configurable: true, }); return skipped; }