From 2174e2da385f38173af0e0443d907fa5ebcd621a Mon Sep 17 00:00:00 2001 From: Alexander Sapountzis Date: Wed, 23 Apr 2025 12:17:29 -0400 Subject: [PATCH 01/10] feat: Add vNext Extensions to Rokt Kit --- src/Rokt-Kit.js | 76 +++++++++++++++++++++++++++++--- test/src/tests.js | 109 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 176 insertions(+), 9 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index 17b12c4..d4a3dd2 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -13,13 +13,19 @@ // See the License for the specific language governing permissions and // limitations under the License. -var roktLauncherScript = 'https://apps.rokt.com/wsdk/integrations/launcher.js'; - var name = 'Rokt'; var moduleId = 181; +var VNEXT_EXTENSIONS = { + 'Coupon on Signup Extension Detection': 'cos-extension-detection', + 'Experiment Monitoring': 'experiment-monitoring', + 'Sponsored Payments Apple Pay': 'sponsored-payments-apple-pay', + 'Realtime Conversion Promotion': 'realtime-conversion-promotion', +}; + var constructor = function () { var self = this; + var roktLauncherScript = ''; self.name = name; self.moduleId = moduleId; @@ -29,14 +35,21 @@ var constructor = function () { self.filters = {}; self.filteredUser = {}; self.userAttributes = {}; + self.testHelpers = null; /** - * Passes attributes to the Rokt Web SDK for client-side hashing - * @see https://docs.rokt.com/developers/integration-guides/web/library/integration-launcher#hash-attributes - * @param {Object} attributes - The attributes to be hashed - * @returns {Promise} A Promise resolving to the - * hashed attributes from the launcher, or `null` if the kit is not initialized + * Generates the Rokt launcher script URL with optional extensions + * @param {Array} extensions - List of extension query parameters to append + * @returns {string} The complete launcher script URL */ + function generateLauncherScript(extensions) { + var baseUrl = 'https://apps.rokt.com/wsdk/integrations/launcher.js'; + if (!extensions || extensions.length === 0) { + return baseUrl; + } + return baseUrl + '?extensions=' + extensions.join(','); + } + function hashAttributes(attributes) { if (!isInitialized()) { console.error('Rokt Kit: Not initialized'); @@ -55,8 +68,15 @@ var constructor = function () { var accountId = settings.accountId; self.userAttributes = filteredUserAttributes; self.onboardingExpProvider = settings.onboardingExpProvider; + self.vNextExtensions = extractvNextExtensions(settings.vNextExtensions); + + roktLauncherScript = generateLauncherScript(self.vNextExtensions); if (testMode) { + // Initialize test helpers only in test mode + self.testHelpers = { + generateLauncherScript: generateLauncherScript, + }; attachLauncher(accountId); return; } @@ -155,6 +175,19 @@ var constructor = function () { self.launcher.selectPlacements(selectPlacementsOptions); } + // TODO: Add JSDocs + function setExtensionData(partnerExtensionData) { + if (!isInitialized()) { + console.error('Rokt Kit: Not initialized'); + return; + } + + // TODO: Should we check if select placements has been called? + // Some extensions seem to need that to happen first + // TODO: Should we attach the Rokt SDK to the kit as well? + window.Rokt.setExtensionData(partnerExtensionData); + } + function onUserIdentified(filteredUser) { self.filteredUser = filteredUser; self.userAttributes = filteredUser.getAllUserAttributes(); @@ -203,6 +236,9 @@ var constructor = function () { // Attaches the kit to the Rokt manager window.mParticle.Rokt.attachKit(self); + // TODO: Add to Core SDK + window.mParticle.Rokt.setExtensionData = self.setExtensionData; + self.isInitialized = true; }) .catch(function (err) { @@ -258,6 +294,7 @@ var constructor = function () { // Kit Callback Methods this.init = initForwarder; + this.setExtensionData = setExtensionData; this.setUserAttribute = setUserAttribute; this.onUserIdentified = onUserIdentified; this.removeUserAttribute = removeUserAttribute; @@ -325,6 +362,31 @@ function mergeObjects() { return resObj; } +function parseSettingsString(settingsString) { + try { + return JSON.parse(settingsString.replace(/"/g, '"')); + } catch (error) { + throw new Error('Settings string contains invalid JSON'); + } +} + +function extractvNextExtensions(settingsString) { + var vNextExtensionSettings = settingsString + ? parseSettingsString(settingsString) + : []; + + var vNextExtensions = []; + for (var i in vNextExtensionSettings) { + var extensionName = vNextExtensionSettings[i].value; + var mappedExtension = VNEXT_EXTENSIONS[extensionName]; + if (mappedExtension) { + vNextExtensions.push(mappedExtension); + } + } + + return vNextExtensions; +} + if (window && window.mParticle && window.mParticle.addForwarder) { window.mParticle.addForwarder({ name: name, diff --git a/test/src/tests.js b/test/src/tests.js index 7c52ee2..b2d7429 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -63,12 +63,11 @@ describe('Rokt Forwarder', () => { this.initializeCalled = false; this.isInitialized = false; - this.accountId = null; this.sandbox = null; this.integrationName = null; - this.createLauncherCalled = false; + this.createLauncher = function (options) { self.accountId = options.accountId; self.integrationName = options.integrationName; @@ -756,4 +755,110 @@ describe('Rokt Forwarder', () => { }); }); }); + + describe('#generateLauncherScript', () => { + const baseUrl = 'https://apps.rokt.com/wsdk/integrations/launcher.js'; + + beforeEach(() => { + window.mParticle.forwarder.init( + { + accountId: '123456', + }, + reportService.cb, + true + ); + }); + + it('should return base URL when no extensions are provided', () => { + const url = + window.mParticle.forwarder.testHelpers.generateLauncherScript( + [] + ); + url.should.equal(baseUrl); + }); + + it('should return base URL when extensions is null or undefined', () => { + window.mParticle.forwarder.testHelpers + .generateLauncherScript(null) + .should.equal(baseUrl); + + window.mParticle.forwarder.testHelpers + .generateLauncherScript(undefined) + .should.equal(baseUrl); + }); + + it('should correctly append a single extension', () => { + const url = + window.mParticle.forwarder.testHelpers.generateLauncherScript([ + 'cos-extension-detection', + ]); + url.should.equal(baseUrl + '?extensions=cos-extension-detection'); + }); + + it('should correctly append multiple extensions', () => { + const url = + window.mParticle.forwarder.testHelpers.generateLauncherScript([ + 'cos-extension-detection', + 'experiment-monitoring', + 'sponsored-payments-apple-pay', + ]); + url.should.equal( + baseUrl + + '?extensions=cos-extension-detection,' + + 'experiment-monitoring,' + + 'sponsored-payments-apple-pay' + ); + }); + }); + + describe('#vNextExtensions', () => { + beforeEach(() => { + window.Rokt = new MockRoktForwarder(); + window.mParticle.Rokt = window.Rokt; + }); + + describe('extractvNextExtensions', () => { + it('should correctly map known extension names to their query parameters', async () => { + await mParticle.forwarder.init( + { + accountId: '123456', + vNextExtensions: + '[{"value":"Coupon on Signup Extension Detection"},' + + '{"value":"Experiment Monitoring"},' + + '{"value":"Sponsored Payments Apple Pay"},' + + '{"value":"Realtime Conversion Promotion"}]', + }, + reportService.cb, + true + ); + + window.mParticle.forwarder.vNextExtensions.should.deepEqual([ + 'cos-extension-detection', + 'experiment-monitoring', + 'sponsored-payments-apple-pay', + 'realtime-conversion-promotion', + ]); + }); + + it('should ignore unknown or invalid extensions', async () => { + await mParticle.forwarder.init( + { + accountId: '123456', + vNextExtensions: + '[{"value":"Unknown Extension"},' + + '{"value":"Experiment Monitoring"},' + + '{"invalid_key":"Invalid Format"},' + + '{"value":"Sponsored Payments Apple Pay"}]', + }, + reportService.cb, + true + ); + + window.mParticle.forwarder.vNextExtensions.should.deepEqual([ + 'experiment-monitoring', + 'sponsored-payments-apple-pay', + ]); + }); + }); + }); }); From 3bf99fbdbe575671c5c19d38f917cf26d4aee7f3 Mon Sep 17 00:00:00 2001 From: Alexander Sapountzis Date: Wed, 23 Apr 2025 17:17:29 -0400 Subject: [PATCH 02/10] refactor: Simplify settings extraction in extractvNextExtensions function --- src/Rokt-Kit.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index d4a3dd2..147cb5e 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -371,13 +371,11 @@ function parseSettingsString(settingsString) { } function extractvNextExtensions(settingsString) { - var vNextExtensionSettings = settingsString - ? parseSettingsString(settingsString) - : []; + var settings = settingsString ? parseSettingsString(settingsString) : []; var vNextExtensions = []; - for (var i in vNextExtensionSettings) { - var extensionName = vNextExtensionSettings[i].value; + for (var i in settings) { + var extensionName = settings[i].value; var mappedExtension = VNEXT_EXTENSIONS[extensionName]; if (mappedExtension) { vNextExtensions.push(mappedExtension); From a1659ebe6b583113cffd52573fd849666b6ee83e Mon Sep 17 00:00:00 2001 From: Alexander Sapountzis Date: Wed, 23 Apr 2025 17:26:01 -0400 Subject: [PATCH 03/10] docs: Add JSDoc comments for setExtensionData function in Rokt Kit --- src/Rokt-Kit.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index 147cb5e..cf0cf87 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -175,7 +175,13 @@ var constructor = function () { self.launcher.selectPlacements(selectPlacementsOptions); } - // TODO: Add JSDocs + /** + * Sets extension data for Rokt Web SDK + * @param {Object} partnerExtensionData - The extension data object containing: + * - [extensionName] {string}: Name of the extension + * - [extensionName].options {Object}: Key-value pairs of options for the extension + * @returns {void} Nothing is returned + */ function setExtensionData(partnerExtensionData) { if (!isInitialized()) { console.error('Rokt Kit: Not initialized'); @@ -236,9 +242,6 @@ var constructor = function () { // Attaches the kit to the Rokt manager window.mParticle.Rokt.attachKit(self); - // TODO: Add to Core SDK - window.mParticle.Rokt.setExtensionData = self.setExtensionData; - self.isInitialized = true; }) .catch(function (err) { From 8ccfd546b9c1a5c1bd3955425da24b40b2bad299 Mon Sep 17 00:00:00 2001 From: Alexander Sapountzis Date: Thu, 24 Apr 2025 11:45:20 -0400 Subject: [PATCH 04/10] Address PR Comments --- src/Rokt-Kit.js | 19 +++++++++-------- test/src/tests.js | 52 ++++++++++++++++++----------------------------- 2 files changed, 31 insertions(+), 40 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index cf0cf87..caef41d 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -25,7 +25,6 @@ var VNEXT_EXTENSIONS = { var constructor = function () { var self = this; - var roktLauncherScript = ''; self.name = name; self.moduleId = moduleId; @@ -50,6 +49,13 @@ var constructor = function () { return baseUrl + '?extensions=' + extensions.join(','); } + /** + * Passes attributes to the Rokt Web SDK for client-side hashing + * @see https://docs.rokt.com/developers/integration-guides/web/library/integration-launcher#hash-attributes + * @param {Object} attributes - The attributes to be hashed + * @returns {Promise} A Promise resolving to the + * hashed attributes from the launcher, or `null` if the kit is not initialized + */ function hashAttributes(attributes) { if (!isInitialized()) { console.error('Rokt Kit: Not initialized'); @@ -66,16 +72,15 @@ var constructor = function () { filteredUserAttributes ) { var accountId = settings.accountId; + var vNextExtensions = extractvNextExtensions(settings.vNextExtensions); self.userAttributes = filteredUserAttributes; self.onboardingExpProvider = settings.onboardingExpProvider; - self.vNextExtensions = extractvNextExtensions(settings.vNextExtensions); - - roktLauncherScript = generateLauncherScript(self.vNextExtensions); if (testMode) { // Initialize test helpers only in test mode self.testHelpers = { generateLauncherScript: generateLauncherScript, + extractvNextExtensions: extractvNextExtensions, }; attachLauncher(accountId); return; @@ -85,7 +90,7 @@ var constructor = function () { var target = document.head || document.body; var script = document.createElement('script'); script.type = 'text/javascript'; - script.src = roktLauncherScript; + script.src = generateLauncherScript(vNextExtensions); script.async = true; script.crossOrigin = 'anonymous'; script.fetchPriority = 'high'; @@ -188,9 +193,6 @@ var constructor = function () { return; } - // TODO: Should we check if select placements has been called? - // Some extensions seem to need that to happen first - // TODO: Should we attach the Rokt SDK to the kit as well? window.Rokt.setExtensionData(partnerExtensionData); } @@ -243,6 +245,7 @@ var constructor = function () { window.mParticle.Rokt.attachKit(self); self.isInitialized = true; + console.warn('Rokt TRACE: launcher called'); }) .catch(function (err) { console.error('Error creating Rokt launcher:', err); diff --git a/test/src/tests.js b/test/src/tests.js index b2d7429..6c33f66 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -819,45 +819,33 @@ describe('Rokt Forwarder', () => { describe('extractvNextExtensions', () => { it('should correctly map known extension names to their query parameters', async () => { - await mParticle.forwarder.init( - { - accountId: '123456', - vNextExtensions: - '[{"value":"Coupon on Signup Extension Detection"},' + + window.mParticle.forwarder.testHelpers + .extractvNextExtensions( + '[{"value":"Coupon on Signup Extension Detection"},' + '{"value":"Experiment Monitoring"},' + '{"value":"Sponsored Payments Apple Pay"},' + - '{"value":"Realtime Conversion Promotion"}]', - }, - reportService.cb, - true - ); - - window.mParticle.forwarder.vNextExtensions.should.deepEqual([ - 'cos-extension-detection', - 'experiment-monitoring', - 'sponsored-payments-apple-pay', - 'realtime-conversion-promotion', - ]); + '{"value":"Realtime Conversion Promotion"}]' + ) + .should.deepEqual([ + 'cos-extension-detection', + 'experiment-monitoring', + 'sponsored-payments-apple-pay', + 'realtime-conversion-promotion', + ]); }); it('should ignore unknown or invalid extensions', async () => { - await mParticle.forwarder.init( - { - accountId: '123456', - vNextExtensions: - '[{"value":"Unknown Extension"},' + + window.mParticle.forwarder.testHelpers + .extractvNextExtensions( + '[{"value":"Unknown Extension"},' + '{"value":"Experiment Monitoring"},' + '{"invalid_key":"Invalid Format"},' + - '{"value":"Sponsored Payments Apple Pay"}]', - }, - reportService.cb, - true - ); - - window.mParticle.forwarder.vNextExtensions.should.deepEqual([ - 'experiment-monitoring', - 'sponsored-payments-apple-pay', - ]); + '{"value":"Sponsored Payments Apple Pay"}]' + ) + .should.deepEqual([ + 'experiment-monitoring', + 'sponsored-payments-apple-pay', + ]); }); }); }); From a884c4dfe94cbd04bb989be584921b3f7477f477 Mon Sep 17 00:00:00 2001 From: Alexander Sapountzis Date: Fri, 25 Apr 2025 11:29:04 -0400 Subject: [PATCH 05/10] Address PR Comments --- src/Rokt-Kit.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index caef41d..10f3eef 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -245,7 +245,6 @@ var constructor = function () { window.mParticle.Rokt.attachKit(self); self.isInitialized = true; - console.warn('Rokt TRACE: launcher called'); }) .catch(function (err) { console.error('Error creating Rokt launcher:', err); From 74924e204ce5a69cbbc150ad5b54c00c3801b2ca Mon Sep 17 00:00:00 2001 From: Alexander Sapountzis Date: Tue, 29 Apr 2025 13:42:49 -0400 Subject: [PATCH 06/10] fix: Rename vNext Extensions to Rokt Extensions --- src/Rokt-Kit.js | 18 +++++++++--------- test/src/tests.js | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index 10f3eef..0f0eb78 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -16,7 +16,7 @@ var name = 'Rokt'; var moduleId = 181; -var VNEXT_EXTENSIONS = { +var ROKT_EXTENSIONS = { 'Coupon on Signup Extension Detection': 'cos-extension-detection', 'Experiment Monitoring': 'experiment-monitoring', 'Sponsored Payments Apple Pay': 'sponsored-payments-apple-pay', @@ -72,7 +72,7 @@ var constructor = function () { filteredUserAttributes ) { var accountId = settings.accountId; - var vNextExtensions = extractvNextExtensions(settings.vNextExtensions); + var roktExtensions = extractRoktExtensions(settings.roktExtensions); self.userAttributes = filteredUserAttributes; self.onboardingExpProvider = settings.onboardingExpProvider; @@ -80,7 +80,7 @@ var constructor = function () { // Initialize test helpers only in test mode self.testHelpers = { generateLauncherScript: generateLauncherScript, - extractvNextExtensions: extractvNextExtensions, + extractRoktExtensions: extractRoktExtensions, }; attachLauncher(accountId); return; @@ -90,7 +90,7 @@ var constructor = function () { var target = document.head || document.body; var script = document.createElement('script'); script.type = 'text/javascript'; - script.src = generateLauncherScript(vNextExtensions); + script.src = generateLauncherScript(roktExtensions); script.async = true; script.crossOrigin = 'anonymous'; script.fetchPriority = 'high'; @@ -375,19 +375,19 @@ function parseSettingsString(settingsString) { } } -function extractvNextExtensions(settingsString) { +function extractRoktExtensions(settingsString) { var settings = settingsString ? parseSettingsString(settingsString) : []; - var vNextExtensions = []; + var roktExtensions = []; for (var i in settings) { var extensionName = settings[i].value; - var mappedExtension = VNEXT_EXTENSIONS[extensionName]; + var mappedExtension = ROKT_EXTENSIONS[extensionName]; if (mappedExtension) { - vNextExtensions.push(mappedExtension); + roktExtensions.push(mappedExtension); } } - return vNextExtensions; + return roktExtensions; } if (window && window.mParticle && window.mParticle.addForwarder) { diff --git a/test/src/tests.js b/test/src/tests.js index 6c33f66..0903d8e 100644 --- a/test/src/tests.js +++ b/test/src/tests.js @@ -811,16 +811,16 @@ describe('Rokt Forwarder', () => { }); }); - describe('#vNextExtensions', () => { + describe('#roktExtensions', () => { beforeEach(() => { window.Rokt = new MockRoktForwarder(); window.mParticle.Rokt = window.Rokt; }); - describe('extractvNextExtensions', () => { + describe('extractRoktExtensions', () => { it('should correctly map known extension names to their query parameters', async () => { window.mParticle.forwarder.testHelpers - .extractvNextExtensions( + .extractRoktExtensions( '[{"value":"Coupon on Signup Extension Detection"},' + '{"value":"Experiment Monitoring"},' + '{"value":"Sponsored Payments Apple Pay"},' + @@ -836,7 +836,7 @@ describe('Rokt Forwarder', () => { it('should ignore unknown or invalid extensions', async () => { window.mParticle.forwarder.testHelpers - .extractvNextExtensions( + .extractRoktExtensions( '[{"value":"Unknown Extension"},' + '{"value":"Experiment Monitoring"},' + '{"invalid_key":"Invalid Format"},' + From d379eaa83d4adf44632a1f465e655e7f7a185923 Mon Sep 17 00:00:00 2001 From: Alexander Sapountzis Date: Tue, 29 Apr 2025 13:48:27 -0400 Subject: [PATCH 07/10] Clean up code --- src/Rokt-Kit.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index 0f0eb78..6dbba60 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -379,7 +379,7 @@ function extractRoktExtensions(settingsString) { var settings = settingsString ? parseSettingsString(settingsString) : []; var roktExtensions = []; - for (var i in settings) { + for (var i = 0; i < settings.length; i++) { var extensionName = settings[i].value; var mappedExtension = ROKT_EXTENSIONS[extensionName]; if (mappedExtension) { From a33b8135a97232a440e7da27fe9da4829d3b006e Mon Sep 17 00:00:00 2001 From: Patrick Wu Date: Tue, 29 Apr 2025 17:52:21 -0400 Subject: [PATCH 08/10] Save visitorID when possible --- src/Rokt-Kit.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index 6dbba60..b3ebb86 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -20,8 +20,8 @@ var ROKT_EXTENSIONS = { 'Coupon on Signup Extension Detection': 'cos-extension-detection', 'Experiment Monitoring': 'experiment-monitoring', 'Sponsored Payments Apple Pay': 'sponsored-payments-apple-pay', - 'Realtime Conversion Promotion': 'realtime-conversion-promotion', -}; + 'Realtime Conversion Promotion': 'realtime-conversion-promotion' +} var constructor = function () { var self = this; @@ -285,6 +285,8 @@ var constructor = function () { return acc; }, {}); + var visitorId = window.optimizely.get('visitor').visitorId; + activeExperiments['rokt.clientcustomerid'] = visitorId; return activeExperiments; } } catch (error) { From a2a48ac79219b5b17c81f759672ba5d9af4c8413 Mon Sep 17 00:00:00 2001 From: Patrick Wu Date: Thu, 1 May 2025 13:21:23 -0400 Subject: [PATCH 09/10] rebase fix --- src/Rokt-Kit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index b3ebb86..4d1acec 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -20,8 +20,8 @@ var ROKT_EXTENSIONS = { 'Coupon on Signup Extension Detection': 'cos-extension-detection', 'Experiment Monitoring': 'experiment-monitoring', 'Sponsored Payments Apple Pay': 'sponsored-payments-apple-pay', - 'Realtime Conversion Promotion': 'realtime-conversion-promotion' -} + 'Realtime Conversion Promotion': 'realtime-conversion-promotion', +}; var constructor = function () { var self = this; From a1fe2477ae21491789ac771d910d518f6b544507 Mon Sep 17 00:00:00 2001 From: Patrick Wu Date: Thu, 1 May 2025 13:42:10 -0400 Subject: [PATCH 10/10] Add parsing for generic experiment attributes passed down --- src/Rokt-Kit.js | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/src/Rokt-Kit.js b/src/Rokt-Kit.js index 4d1acec..b35fcc0 100644 --- a/src/Rokt-Kit.js +++ b/src/Rokt-Kit.js @@ -160,14 +160,11 @@ var constructor = function () { self.userAttributes = filteredAttributes; - var optimizelyAttributes = - self.onboardingExpProvider === 'Optimizely' - ? fetchOptimizely() - : {}; + var experimentAttributes = formatExperimentAttributes(attributes); var selectPlacementsAttributes = mergeObjects( filteredAttributes, - optimizelyAttributes, + experimentAttributes, { mpid: mpid, } @@ -251,6 +248,22 @@ var constructor = function () { }); } + function formatExperimentAttributes(attributes) { + var PREFIX = 'rokt.partnerexperiment.'; + var EXPERIMENT_ID_KEY = PREFIX + 'experimentid'; + var BUCKET_ID_KEY = PREFIX + 'bucketid'; + var USER_ID_KEY = PREFIX + 'userid'; + + if (self.onboardingExpProvider === 'Optimizely') { + return fetchOptimizely(attributes); + } + + var result = {}; + result[PREFIX + attributes[EXPERIMENT_ID_KEY] + '.bucketid'] = + attributes[BUCKET_ID_KEY]; + result['rokt.clientcustomerid'] = attributes[USER_ID_KEY]; + return result; + } // mParticle Kit Callback Methods function fetchOptimizely() { var forwarders = window.mParticle @@ -277,11 +290,8 @@ var constructor = function () { acc, expId ) { - acc[ - 'rokt.custom.optimizely.experiment.' + - expId + - '.variationId' - ] = optimizelyState.getVariationMap()[expId].id; + acc['rokt.partnerexperiment.' + expId + '.bucketid'] = + optimizelyState.getVariationMap()[expId].id; return acc; }, {});