@@ -30,7 +30,7 @@ function init (moduleConfig, userConsent) {
30
30
export function initSegments ( reqBidsConfigObj , callback , customModuleConfig ) {
31
31
const permutiveOnPage = isPermutiveOnPage ( )
32
32
const moduleConfig = getModuleConfig ( customModuleConfig )
33
- const segmentData = getSegments ( moduleConfig . params . maxSegs )
33
+ const segmentData = getSegments ( moduleConfig . params . maxSegs , segmentIdTransformationsByBidder )
34
34
35
35
setSegments ( reqBidsConfigObj , moduleConfig , segmentData )
36
36
@@ -70,11 +70,12 @@ export function setBidderRtb (auctionDetails, customModuleConfig) {
70
70
const moduleConfig = getModuleConfig ( customModuleConfig )
71
71
const acBidders = deepAccess ( moduleConfig , 'params.acBidders' )
72
72
const maxSegs = deepAccess ( moduleConfig , 'params.maxSegs' )
73
- const segmentData = getSegments ( maxSegs )
73
+ const segmentData = getSegments ( maxSegs , segmentIdTransformationsByBidder )
74
74
75
75
acBidders . forEach ( function ( bidder ) {
76
76
const currConfig = bidderConfig [ bidder ] || { }
77
- const nextConfig = mergeOrtbConfig ( currConfig , segmentData )
77
+ const extData = extensionDataByBidder [ bidder ] || { }
78
+ const nextConfig = mergeOrtbConfig ( currConfig , segmentData , extData )
78
79
79
80
config . setBidderConfig ( {
80
81
bidders : [ bidder ] ,
@@ -84,12 +85,13 @@ export function setBidderRtb (auctionDetails, customModuleConfig) {
84
85
}
85
86
86
87
/**
87
- * Merges segments into existing bidder config
88
+ * Merges segments and extension data into existing bidder config
88
89
* @param {Object } currConfig - Current bidder config
89
90
* @param {Object } segmentData - Segment data
91
+ * @param {Object } extData - Exchange-specific extension data
90
92
* @return {Object } Merged ortb2 object
91
93
*/
92
- function mergeOrtbConfig ( currConfig , segmentData ) {
94
+ function mergeOrtbConfig ( currConfig , segmentData , extData ) {
93
95
const segment = segmentData . ac . map ( seg => {
94
96
return { id : seg }
95
97
} )
@@ -98,7 +100,7 @@ function mergeOrtbConfig (currConfig, segmentData) {
98
100
const currSegments = deepAccess ( ortbConfig , 'ortb2.user.data' ) || [ ]
99
101
const userSegment = currSegments
100
102
. filter ( el => el . name !== name )
101
- . concat ( { name, segment } )
103
+ . concat ( { name, segment, ext : extData } )
102
104
103
105
deepSetValue ( ortbConfig , 'ortb2.user.data' , userSegment )
104
106
@@ -225,9 +227,10 @@ export function isPermutiveOnPage () {
225
227
/**
226
228
* Get all relevant segment IDs in an object
227
229
* @param {number } maxSegs - Maximum number of segments to be included
230
+ * @param {Object } bidderTransformations - object containing functions to transform segment IDs, keyed by bidder ID
228
231
* @return {Object }
229
232
*/
230
- export function getSegments ( maxSegs ) {
233
+ export function getSegments ( maxSegs , bidderTransformations ) {
231
234
const legacySegs = readSegments ( '_psegs' ) . map ( Number ) . filter ( seg => seg >= 1000000 ) . map ( String )
232
235
const _ppam = readSegments ( '_ppam' )
233
236
const _pcrprs = readSegments ( '_pcrprs' )
@@ -236,11 +239,16 @@ export function getSegments (maxSegs) {
236
239
ac : [ ..._pcrprs , ..._ppam , ...legacySegs ] ,
237
240
rubicon : readSegments ( '_prubicons' ) ,
238
241
appnexus : readSegments ( '_papns' ) ,
239
- gam : readSegments ( '_pdfps' )
242
+ gam : readSegments ( '_pdfps' ) ,
243
+ ix : legacySegs
240
244
}
241
245
242
- for ( const type in segments ) {
243
- segments [ type ] = segments [ type ] . slice ( 0 , maxSegs )
246
+ for ( const bidder in segments ) {
247
+ segments [ bidder ] = segments [ bidder ] . slice ( 0 , maxSegs )
248
+
249
+ if ( bidderTransformations . hasOwnProperty ( bidder ) ) {
250
+ segments [ bidder ] = bidderTransformations [ bidder ] ( segments [ bidder ] )
251
+ }
244
252
}
245
253
246
254
return segments
@@ -260,6 +268,37 @@ function readSegments (key) {
260
268
}
261
269
}
262
270
271
+ /**
272
+ * Bidder-specific extension data for use in the ORTB2 object.
273
+ */
274
+ const extensionDataByBidder = {
275
+ ix : {
276
+ segtax : '4'
277
+ }
278
+ }
279
+
280
+ /**
281
+ * Bidder-specific functions to apply to an array of segment IDs.
282
+ * Each function should return an a new array of transformed segment IDs.
283
+ */
284
+ const segmentIdTransformationsByBidder = {
285
+ ix : segments => segments . map ( iabSegmentId ) . filter ( id => id != 'unknown' )
286
+ }
287
+
288
+ /**
289
+ * Transform a Permutive segment ID into an IAB audience taxonomy ID.
290
+ * Currently uses a hardcoded mapping to support an initial test of this functionality.
291
+ * @param {string } permutiveSegmentId
292
+ * @return {string } IAB audience taxonomy ID associated with the Permutive segment ID
293
+ */
294
+ function iabSegmentId ( permutiveSegmentId ) {
295
+ const iabIdsByPermutiveId = {
296
+ 1 : '1' // TODO
297
+ }
298
+
299
+ return iabIdsByPermutiveId [ permutiveSegmentId ] || 'unknown'
300
+ }
301
+
263
302
/** @type {RtdSubmodule } */
264
303
export const permutiveSubmodule = {
265
304
name : MODULE_NAME ,
0 commit comments