From a1a5482ed70826910d8f782f1fe6fee01b655377 Mon Sep 17 00:00:00 2001 From: grzgm <125459798+grzgm@users.noreply.github.com> Date: Wed, 17 Dec 2025 12:45:40 +0100 Subject: [PATCH 01/24] feat: add live display and access examples of Neuwo API data to example page --- .../gpt/neuwoRtdProvider_example.html | 75 ++++++++++++++++++- 1 file changed, 73 insertions(+), 2 deletions(-) diff --git a/integrationExamples/gpt/neuwoRtdProvider_example.html b/integrationExamples/gpt/neuwoRtdProvider_example.html index 3d6fef98995..02fb0715884 100644 --- a/integrationExamples/gpt/neuwoRtdProvider_example.html +++ b/integrationExamples/gpt/neuwoRtdProvider_example.html @@ -286,14 +286,85 @@

Div-2

Neuwo Data in Bid Request

-

The retrieved data from Neuwo API is injected into the bid request as OpenRTB (ORTB2)`site.content.data` and - `user.data`. Full bid request can be inspected in Developer Tools Console under +

The retrieved data from Neuwo API is injected into the bid request as OpenRTB (ORTB2) + site.content.data and + user.data. Full bid request can be inspected in Developer Tools Console under INFO: NeuwoRTDModule injectIabCategories: post-injection bidsConfig

+

Neuwo Site Content Data

+
No data yet. Click "Update" to fetch data.
+

Neuwo User Data

+
No data yet. Click "Update" to fetch data.
+
+ +
+

Accessing Neuwo Data in JavaScript

+

Listen to the bidRequested event to access the enriched ORTB2 data:

+
+pbjs.onEvent('bidRequested', function(bidRequest) {
+    const ortb2 = bidRequest.ortb2;
+    const neuwoSiteData = ortb2?.site?.content?.data?.find(d => d.name === 'www.neuwo.ai');
+    const neuwoUserData = ortb2?.user?.data?.find(d => d.name === 'www.neuwo.ai');
+    console.log('Neuwo data:', { siteContent: neuwoSiteData, user: neuwoUserData });
+});
+        
+

After clicking "Update", the Neuwo data is stored in the global neuwoData variable. Open + Developer Tools Console to see the logged data.

+

For more information about accessing data retrieved from Neuwo API, see modules/neuwoRtdProvider.md.

+ + Ad spot div-1: This content will be replaced by prebid.js and/or related components once you click @@ -272,10 +277,10 @@

Div-1

Div-2

-
- Ad spot div-2: This content will be replaced by prebid.js and/or related components once you click @@ -292,29 +297,34 @@

Neuwo Data in Bid Request

INFO: NeuwoRTDModule injectIabCategories: post-injection bidsConfig

Neuwo Site Content Data

-
No data yet. Click "Update" to fetch data.
+
No data yet. Click "Update" to fetch data.

Neuwo User Data

-
No data yet. Click "Update" to fetch data.
+
No data yet. Click "Update" to fetch data.

Accessing Neuwo Data in JavaScript

Listen to the bidRequested event to access the enriched ORTB2 data:

-pbjs.onEvent('bidRequested', function(bidRequest) {
+pbjs.onEvent("bidRequested", function(bidRequest) {
     const ortb2 = bidRequest.ortb2;
-    const neuwoSiteData = ortb2?.site?.content?.data?.find(d => d.name === 'www.neuwo.ai');
-    const neuwoUserData = ortb2?.user?.data?.find(d => d.name === 'www.neuwo.ai');
-    console.log('Neuwo data:', { siteContent: neuwoSiteData, user: neuwoUserData });
+    const neuwoSiteData = ortb2?.site?.content?.data?.find(d => d.name === "www.neuwo.ai");
+    const neuwoUserData = ortb2?.user?.data?.find(d => d.name === "www.neuwo.ai");
+    console.log("Neuwo data:", { siteContent: neuwoSiteData, user: neuwoUserData });
 });
         

After clicking "Update", the Neuwo data is stored in the global neuwoData variable. Open Developer Tools Console to see the logged data.

-

Note: Event timing tests for multiple Prebid.js events (auctionInit, bidRequested, beforeBidderHttp, bidResponse, auctionEnd) are available in the page source code but are commented out. To enable them, uncomment the timing test section in the JavaScript code.

+

Note: Event timing tests for multiple Prebid.js events (auctionInit, bidRequested, + beforeBidderHttp, bidResponse, auctionEnd) are available in the page source code but are commented out. To + enable them, uncomment the timing test section in the JavaScript code.

-

For more information about Neuwo RTD Module configuration and accessing data retrieved from Neuwo API, see modules/neuwoRtdProvider.md.

+

For more information about Neuwo RTD Module configuration and accessing data retrieved from Neuwo API, see modules/neuwoRtdProvider.md.

@@ -326,50 +336,50 @@

Accessing Neuwo Data in JavaScript

// ===================================================== let neuwoData = null; // Global variable to store Neuwo data for later use - pbjs.que.push(function() { - pbjs.onEvent('bidRequested', function(bidRequest) { - console.log('=== Neuwo Data Access: bidRequested Event ==='); + pbjs.que.push(function () { + pbjs.onEvent("bidRequested", function (bidRequest) { + console.log("=== Neuwo Data Access: bidRequested Event ==="); // The ortb2 data is available directly on the bidRequest if (bidRequest && bidRequest.ortb2) { const ortb2 = bidRequest.ortb2; - console.log('Full ORTB2 from bidRequest:', ortb2); + console.log("Full ORTB2 from bidRequest:", ortb2); // Extract Neuwo-specific data (from www.neuwo.ai provider) const siteContentData = ortb2?.site?.content?.data; const userData = ortb2?.user?.data; // Filter to get only Neuwo data - const neuwoSiteData = siteContentData?.find(d => d.name === 'www.neuwo.ai'); - const neuwoUserData = userData?.find(d => d.name === 'www.neuwo.ai'); + const neuwoSiteData = siteContentData?.find(d => d.name === "www.neuwo.ai"); + const neuwoUserData = userData?.find(d => d.name === "www.neuwo.ai"); // Store in global variable for later use neuwoData = { siteContent: neuwoSiteData, user: neuwoUserData }; - console.log('Neuwo data stored in global "neuwoData" variable:', neuwoData); + console.log("Neuwo data stored in global \"neuwoData\" variable:", neuwoData); updateDisplayElements(neuwoSiteData, neuwoUserData) } else { - console.warn('No ortb2 data found in bidRequest. This may indicate the RTD module has not enriched the bid request yet.'); + console.warn("No ortb2 data found in bidRequest. This may indicate the RTD module has not enriched the bid request yet."); } }); }); // Helper to update display elements function updateDisplayElements(neuwoSiteData, neuwoUserData) { - const siteDataEl = document.getElementById('neuwo-site-data'); - const userDataEl = document.getElementById('neuwo-user-data'); + const siteDataEl = document.getElementById("neuwo-site-data"); + const userDataEl = document.getElementById("neuwo-user-data"); if (siteDataEl) { siteDataEl.textContent = neuwoSiteData ? JSON.stringify(neuwoSiteData, null, 2) - : 'No Neuwo site content data found in response.'; + : "No Neuwo site content data found in response."; } if (userDataEl) { userDataEl.textContent = neuwoUserData ? JSON.stringify(neuwoUserData, null, 2) - : 'No Neuwo user data found in response.'; + : "No Neuwo user data found in response."; } } @@ -381,13 +391,13 @@

Accessing Neuwo Data in JavaScript

let eventOrder = 0; // Reset timing on Update button click - window.addEventListener('DOMContentLoaded', function() { - const updateButton = document.querySelector('button[onClick="onSettingsUpdate()"]'); + window.addEventListener("DOMContentLoaded", function () { + const updateButton = document.querySelector("button[onClick=\"onSettingsUpdate()\"]"); if (updateButton) { - updateButton.addEventListener('click', function() { + updateButton.addEventListener("click", function () { eventOrder = 0; startTime = performance.now(); - console.log('=== Timing test reset - awaiting first event after Update click ==='); + console.log("=== Timing test reset - awaiting first event after Update click ==="); }); } }); @@ -396,11 +406,11 @@

Accessing Neuwo Data in JavaScript

function extractNeuwoData(ortb2, eventName) { const siteContentData = ortb2?.site?.content?.data; const userData = ortb2?.user?.data; - const neuwoSiteData = siteContentData?.find(d => d.name === 'www.neuwo.ai'); - const neuwoUserData = userData?.find(d => d.name === 'www.neuwo.ai'); + const neuwoSiteData = siteContentData?.find(d => d.name === "www.neuwo.ai"); + const neuwoUserData = userData?.find(d => d.name === "www.neuwo.ai"); const hasData = !!(neuwoSiteData || neuwoUserData); - const status = hasData ? 'HAS DATA' : 'NO DATA'; + const status = hasData ? "HAS DATA" : "NO DATA"; console.log(`[${eventName}] Status: ${status}`); if (hasData) { @@ -416,165 +426,166 @@

Accessing Neuwo Data in JavaScript

// ===================================================== // EVENT 1: auctionInit // ===================================================== - pbjs.onEvent('auctionInit', function (auctionData) { + pbjs.onEvent("auctionInit", function (auctionData) { eventOrder++; const time = (performance.now() - startTime).toFixed(2); console.log(`\n=== [${eventOrder}] auctionInit (${time}ms) ===`); - console.log('auctionData keys:', Object.keys(auctionData)); - console.log('bidderRequests count:', auctionData.bidderRequests?.length || 0); + console.log("auctionData keys:", Object.keys(auctionData)); + console.log("bidderRequests count:", auctionData.bidderRequests?.length || 0); if (auctionData.bidderRequests && auctionData.bidderRequests.length > 0) { const ortb2 = auctionData.bidderRequests[0].ortb2; - const result = extractNeuwoData(ortb2, 'auctionInit'); + const result = extractNeuwoData(ortb2, "auctionInit"); } else { - console.log('[auctionInit] NO bidderRequests available'); + console.log("[auctionInit] NO bidderRequests available"); } }); // ===================================================== // EVENT 2: bidRequested (fires per bidder) // ===================================================== - pbjs.onEvent('bidRequested', function (bidderRequest) { + pbjs.onEvent("bidRequested", function (bidderRequest) { eventOrder++; const time = (performance.now() - startTime).toFixed(2); console.log(`\n=== [${eventOrder}] bidRequested (${time}ms) - Bidder: ${bidderRequest.bidderCode} ===`); const ortb2 = bidderRequest.ortb2; - extractNeuwoData(ortb2, 'bidRequested'); + extractNeuwoData(ortb2, "bidRequested"); }); // ===================================================== // EVENT 3: beforeBidderHttp // ===================================================== - pbjs.onEvent('beforeBidderHttp', function (bidRequests) { + pbjs.onEvent("beforeBidderHttp", function (bidRequests) { eventOrder++; const time = (performance.now() - startTime).toFixed(2); console.log(`\n=== [${eventOrder}] beforeBidderHttp (${time}ms) ===`); - console.log('bidRequests is array:', Array.isArray(bidRequests)); - console.log('bidRequests count:', bidRequests?.length || 0); + console.log("bidRequests is array:", Array.isArray(bidRequests)); + console.log("bidRequests count:", bidRequests?.length || 0); if (Array.isArray(bidRequests) && bidRequests.length > 0) { const ortb2 = bidRequests[0].ortb2; - extractNeuwoData(ortb2, 'beforeBidderHttp'); + extractNeuwoData(ortb2, "beforeBidderHttp"); } else if (bidRequests && !Array.isArray(bidRequests)) { - // Maybe it's a single object? + // Maybe it"s a single object? const ortb2 = bidRequests.ortb2; - extractNeuwoData(ortb2, 'beforeBidderHttp'); + extractNeuwoData(ortb2, "beforeBidderHttp"); } else { - console.log('[beforeBidderHttp] NO bidRequests available'); + console.log("[beforeBidderHttp] NO bidRequests available"); } }); // ===================================================== // EVENT 4: bidResponse // ===================================================== - pbjs.onEvent('bidResponse', function (bidResponse) { + pbjs.onEvent("bidResponse", function (bidResponse) { eventOrder++; const time = (performance.now() - startTime).toFixed(2); console.log(`\n=== [${eventOrder}] bidResponse (${time}ms) ===`); - console.log('bidResponse keys:', Object.keys(bidResponse)); + console.log("bidResponse keys:", Object.keys(bidResponse)); // Check if ortb2 is directly on bidResponse if (bidResponse.ortb2) { - extractNeuwoData(bidResponse.ortb2, 'bidResponse'); + extractNeuwoData(bidResponse.ortb2, "bidResponse"); } else { - console.log('[bidResponse] No direct ortb2 on bidResponse object'); + console.log("[bidResponse] No direct ortb2 on bidResponse object"); } }); // ===================================================== // EVENT 5: auctionEnd // ===================================================== - pbjs.onEvent('auctionEnd', function (auctionData) { + pbjs.onEvent("auctionEnd", function (auctionData) { eventOrder++; const time = (performance.now() - startTime).toFixed(2); console.log(`\n=== [${eventOrder}] auctionEnd (${time}ms) ===`); - console.log('bidderRequests count:', auctionData.bidderRequests?.length || 0); + console.log("bidderRequests count:", auctionData.bidderRequests?.length || 0); if (auctionData.bidderRequests && auctionData.bidderRequests.length > 0) { const ortb2 = auctionData.bidderRequests[0].ortb2; - extractNeuwoData(ortb2, 'auctionEnd'); + extractNeuwoData(ortb2, "auctionEnd"); } else { - console.log('[auctionEnd] NO bidderRequests available'); + console.log("[auctionEnd] NO bidderRequests available"); } // Print summary - console.log('\n========================================'); - console.log('EVENT TESTING COMPLETE'); - console.log('========================================'); + console.log("\n========================================"); + console.log("EVENT TESTING COMPLETE"); + console.log("========================================"); }); }); */ +