From 53096338098d0614e11087b4c090316edc5d51f1 Mon Sep 17 00:00:00 2001 From: oronw Date: Mon, 7 Feb 2022 17:29:56 +0200 Subject: [PATCH 1/2] initial localStorage implementation --- modules/riseBidAdapter.js | 118 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 114 insertions(+), 4 deletions(-) diff --git a/modules/riseBidAdapter.js b/modules/riseBidAdapter.js index 463f13f7d6c..8c3bc084c6e 100644 --- a/modules/riseBidAdapter.js +++ b/modules/riseBidAdapter.js @@ -1,7 +1,10 @@ -import { logWarn, logInfo, isArray, isFn, deepAccess, isEmpty, contains, timestamp, getBidIdParameter, triggerPixel } from '../src/utils.js'; +import { logWarn, logInfo, isArray, isFn, deepAccess, isEmpty, contains, timestamp, getBidIdParameter, triggerPixel, hasDeviceAccess } from '../src/utils.js'; import {registerBidder} from '../src/adapters/bidderFactory.js'; import {BANNER, VIDEO} from '../src/mediaTypes.js'; import {config} from '../src/config.js'; +import CONSTANTS from '../src/constants.json'; +import events from '../src/events.js'; +import { getStorageManager, validateStorageEnforcement } from '../src/storageManager.js'; const SUPPORTED_AD_TYPES = [BANNER, VIDEO]; const BIDDER_CODE = 'rise'; @@ -17,13 +20,19 @@ const SUPPORTED_SYNC_METHODS = { IFRAME: 'iframe', PIXEL: 'pixel' } +const GVLID = 1043; +const LOCAL_STORAGE_KEY = 'rpsk8'; +export const storage = getStorageManager(GVLID, BIDDER_CODE); export const spec = { code: BIDDER_CODE, - gvlid: 1043, + gvlid: GVLID, version: ADAPTER_VERSION, supportedMediaTypes: SUPPORTED_AD_TYPES, + isBidRequestValid: function (bidRequest) { + events.on(CONSTANTS.EVENTS.AUCTION_DEBUG, localStorageHandler); + if (!bidRequest.params) { logWarn('no params have been set to Rise adapter'); return false; @@ -46,6 +55,13 @@ export const spec = { combinedRequestsObject.params = generateGeneralParams(generalObject, bidderRequest); combinedRequestsObject.bids = generateBidsParams(validBidRequests, bidderRequest); + // Get cached errors stored in LocalStorage + const cachedErrors = getCachedErrors(); + + if (!isEmpty(cachedErrors)) { + combinedRequestsObject.errors = cachedErrors; + } + return { method: 'POST', url: getEndpoint(testMode), @@ -94,12 +110,10 @@ export const spec = { if (syncOptions.iframeEnabled && response.body.params.userSyncURL) { syncs.push({ type: 'iframe', - // TODO: verify url is correct url: response.body.params.userSyncURL }); } if (syncOptions.pixelEnabled && isArray(response.body.params.userSyncPixels)) { - // TODO: verify pixels is correct const pixels = response.body.params.userSyncPixels.map(pixel => { return { type: 'image', @@ -413,3 +427,99 @@ function generateGeneralParams(generalObject, bidderRequest) { return generalParams } + +function localStorageHandler(data) { + if (data.type === 'WARNING' && data.arguments) { + const DEFAULT_ENFORCEMENT_SETTINGS = { + hasEnforcementHook: false, + valid: hasDeviceAccess() + }; + validateStorageEnforcement(GVLID, BIDDER_CODE, DEFAULT_ENFORCEMENT_SETTINGS, (permissions) => { + if (permissions.valid) { + storeErrorEventData(data); + } + }); + } +} + +/** + * @typedef {Array[message: string, err: Object]} ErrorData + * @property {string} message - The error message. + * @property {object} err - The error object. + * @property {string} err.bidder - The bidder of the error. + * @property {string} err.code - The error code. + */ +function storeErrorEventData(data) { + if (!storage.localStorageIsEnabled()) { + return; + } + + let currentStorage; + + try { + currentStorage = JSON.parse(storage.getDataFromLocalStorage(LOCAL_STORAGE_KEY) || '{}'); + } catch (e) { + logWarn('rise adapter cannot read rpsk8 from localStorage.'); + } + + const todayDate = new Date(); + + Object.keys(currentStorage).map((errorDate) => { + const date = new Date(errorDate); + + if (date.setDate(date.getDate() + 7) - todayDate < 0) { + delete currentStorage[errorDate]; + } + }); + + if (data.type === 'WARNING' && data.arguments && data.arguments[1] && data.arguments[1].bidder === BIDDER_CODE) { + const todayString = todayDate.toISOString().slice(0, 10); + + const errorCode = data.arguments[1].code; + + if (errorCode) { + currentStorage[todayString] = currentStorage[todayString] || {}; + + if (!Number(currentStorage[todayString][errorCode])) { + currentStorage[todayString][errorCode] = 0; + } + + currentStorage[todayString][errorCode]++; + }; + } + + storage.setDataInLocalStorage(LOCAL_STORAGE_KEY, JSON.stringify(currentStorage)); +} + +/** + * Get stored in LocalStorage and format to be added to request payload + * + * @returns {Object} Object with error codes and counts + */ +function getCachedErrors() { + if (!storage.localStorageIsEnabled()) { + return; + } + + const errors = {}; + let currentStorage; + + try { + currentStorage = JSON.parse(storage.getDataFromLocalStorage(LOCAL_STORAGE_KEY) || '{}'); + } catch (e) { + logError('rise adapter cannot read rpsk8 from localStorage.'); + return null; + } + + Object.keys(currentStorage).forEach((date) => { + Object.keys(currentStorage[date]).forEach((code) => { + if (typeof currentStorage[date][code] === 'number') { + errors[code] = errors[code] + ? errors[code] + currentStorage[date][code] + : currentStorage[date][code]; + } + }); + }); + + return errors; +} From b81aed56f5011fd304ac41967551167829de213e Mon Sep 17 00:00:00 2001 From: oronw Date: Mon, 7 Feb 2022 18:07:47 +0200 Subject: [PATCH 2/2] adding and deleting rise key in local storage --- modules/riseBidAdapter.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/modules/riseBidAdapter.js b/modules/riseBidAdapter.js index 8c3bc084c6e..d1edc3890ee 100644 --- a/modules/riseBidAdapter.js +++ b/modules/riseBidAdapter.js @@ -68,8 +68,10 @@ export const spec = { data: combinedRequestsObject } }, - interpretResponse: function ({body}) { + interpretResponse: function ({body}, bidderRequest) { const bidResponses = []; + let requestBidErrors = bidderRequest.data; + if (body.bids) { body.bids.forEach(adUnit => { @@ -102,6 +104,16 @@ export const spec = { }); } + if (deepAccess(requestBidErrors, 'errors')) { + if (storage.localStorageIsEnabled()) { + try { + storage.removeDataFromLocalStorage(LOCAL_STORAGE_KEY); + } catch (e) { + logError('rise cannot clear rpsk8 from localStorage.'); + } + } + } + return bidResponses; }, getUserSyncs: function (syncOptions, serverResponses) { @@ -472,10 +484,10 @@ function storeErrorEventData(data) { } }); - if (data.type === 'WARNING' && data.arguments && data.arguments[1] && data.arguments[1].bidder === BIDDER_CODE) { + if (data.type === 'WARNING' && data.arguments) { const todayString = todayDate.toISOString().slice(0, 10); - const errorCode = data.arguments[1].code; + const errorCode = 6; if (errorCode) { currentStorage[todayString] = currentStorage[todayString] || {};