Skip to content

Commit

Permalink
djax new bidder adapter (#4192)
Browse files Browse the repository at this point in the history
* djax bidder adapter

* djax bidder adapter

* Update hello_world.html
  • Loading branch information
djaxbidder authored and jsnellbaker committed Sep 27, 2019
1 parent 25e5fd0 commit 91146b6
Show file tree
Hide file tree
Showing 3 changed files with 338 additions and 0 deletions.
129 changes: 129 additions & 0 deletions modules/djaxBidAdapter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
import { registerBidder } from '../src/adapters/bidderFactory';
import { config } from '../src/config';
import * as utils from '../src/utils';
import {BANNER, VIDEO} from '../src/mediaTypes';
import { ajax } from '../src/ajax';
import {Renderer} from '../src/Renderer';

const SUPPORTED_AD_TYPES = [BANNER, VIDEO];
const BIDDER_CODE = 'djax';
const DOMAIN = 'https://demo.reviveadservermod.com/headerbidding_adminshare/';
const RENDERER_URL = '//acdn.adnxs.com/video/outstream/ANOutstreamVideo.js';

function isBidRequestValid(bid) {
return (typeof bid.params !== 'undefined' && parseInt(utils.getValue(bid.params, 'publisherId')) > 0);
}

function buildRequests(validBidRequests) {
return {
method: 'POST',
url: DOMAIN + 'www/admin/plugins/Prebid/getAd.php',
options: {
withCredentials: false,
crossOrigin: true
},
data: validBidRequests,
};
}

function interpretResponse(serverResponse, request) {
const response = serverResponse.body;
const bidResponses = [];
var bidRequestResponses = [];

utils._each(response, function(bidAd) {
bidAd.adResponse = {
content: bidAd.vastXml,
height: bidAd.height,
width: bidAd.width
};
bidAd.ttl = config.getConfig('_bidderTimeout')
bidAd.renderer = bidAd.context === 'outstream' ? createRenderer(bidAd, {
id: bidAd.adUnitCode,
url: RENDERER_URL
}, bidAd.adUnitCode) : undefined;
bidResponses.push(bidAd);
});

bidRequestResponses.push({
function: 'saveResponses',
request: request,
response: bidResponses
});
sendResponseToServer(bidRequestResponses);
return bidResponses;
}

function outstreamRender(bidAd) {
bidAd.renderer.push(() => {
window.ANOutstreamVideo.renderAd({
sizes: [bidAd.width, bidAd.height],
width: bidAd.width,
height: bidAd.height,
targetId: bidAd.adUnitCode,
adResponse: bidAd.adResponse,
rendererOptions: {
showVolume: false,
allowFullscreen: false
}
});
});
}

function createRenderer(bidAd, rendererParams, adUnitCode) {
const renderer = Renderer.install({
id: rendererParams.id,
url: rendererParams.url,
loaded: false,
config: {'player_height': bidAd.height, 'player_width': bidAd.width},
adUnitCode
});
try {
renderer.setRender(outstreamRender);
} catch (err) {
utils.logWarn('Prebid Error calling setRender on renderer', err);
}
return renderer;
}

function onBidWon(bid) {
let wonBids = [];
wonBids.push(bid);
wonBids[0].function = 'onBidWon';
sendResponseToServer(wonBids);
}

function onTimeout(details) {
details.unshift({ 'function': 'onTimeout' });
sendResponseToServer(details);
}

function sendResponseToServer(data) {
ajax(DOMAIN + 'www/admin/plugins/Prebid/tracking/track.php', null, JSON.stringify(data), {
withCredentials: false,
method: 'POST',
crossOrigin: true
});
}

function getUserSyncs(syncOptions) {
if (syncOptions.iframeEnabled) {
return [{
type: 'iframe',
url: DOMAIN + 'www/admin/plugins/Prebid/userSync.php'
}];
}
}

export const spec = {
code: BIDDER_CODE,
supportedMediaTypes: SUPPORTED_AD_TYPES,
isBidRequestValid,
buildRequests,
interpretResponse,
getUserSyncs,
onBidWon,
onTimeout
};

registerBidder(spec);
50 changes: 50 additions & 0 deletions modules/djaxBidAdapter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Overview

```
Module Name: djax Bid Adapter
Module Type: Bidder Adapter
Maintainer : support@djaxtech.com
```

# Description

Connects to Djax Ad Server for bids.

djax bid adapter supports Banner and Video.

# Test Parameters
```
var adUnits = [
//bannner object
{
code: 'banner-ad-slot',
mediaTypes: {
banner: {
sizes: [[300, 250], [300,600]],
}
},
bids: [{
bidder: 'djax',
params: {
publisherId: 2
}
}]
},
//video object
{
code: 'video-ad-slot',
mediaTypes: {
video: {
context: 'instream',
playerSize: [640, 480],
},
},
bids: [{
bidder: "djax",
params: {
publisherId: 2
}
}]
}];
```
159 changes: 159 additions & 0 deletions test/spec/modules/djaxBidAdapter_spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
import { expect } from 'chai';
import { spec } from 'modules/djaxBidAdapter';

const ENDPOINT = 'https://demo.reviveadservermod.com/headerbidding_adminshare/www/admin/plugins/Prebid/getAd.php';

describe('The Djax bidding adapter', function () {
describe('isBidRequestValid', function () {
it('should return false when given an invalid bid', function () {
const bid = {
bidder: 'djax',
};
const isValid = spec.isBidRequestValid(bid);
expect(isValid).to.equal(false);
});

it('should return true when given a publisherId in bid', function () {
const bid = {
bidder: 'djax',
params: {
publisherId: 2
},
};
const isValid = spec.isBidRequestValid(bid);
expect(isValid).to.equal(true);
});
});

describe('buildRequests', function () {
const bidRequests = [{
'bidder': 'djax',
'params': {
'publisherId': 2
},
'adUnitCode': 'adunit-code',
'sizes': [
[300, 250],
[300, 600]
]
}];

const request = spec.buildRequests(bidRequests);

it('sends bid request to our endpoint via POST', function () {
expect(request.method).to.equal('POST');
});

it('check endpoint url', function () {
expect(request.url).to.equal(ENDPOINT)
});

it('sets the proper banner object', function () {
expect(bidRequests[0].params.publisherId).to.equal(2);
})
});
const response = {
body: [
{
'requestId': '2ee937f15015c6',
'cpm': '0.2000',
'width': 300,
'height': 600,
'creativeId': '4',
'currency': 'USD',
'netRevenue': true,
'ad': 'ads.html',
'mediaType': 'banner'
},
{
'requestId': '3e1af92622bdc',
'cpm': '0.2000',
'creativeId': '4',
'context': 'outstream',
'currency': 'USD',
'netRevenue': true,
'vastUrl': 'tezt.xml',
'width': 640,
'height': 480,
'mediaType': 'video'
}]
};

const request = [
{
'bidder': 'djax',
'params': {
'publisherId': 2
},
'mediaTypes': {
'banner': {
'sizes': [
[300, 600]
]
}
},
'bidId': '2ee937f15015c6',
'src': 'client',
},
{
'bidder': 'djax',
'params': {
'publisherId': 2
},
'mediaTypes': {
'video': {
'context': 'outstream',
'playerSize': [
[640, 480]
]
}
},
'bidId': '3e1af92622bdc',
'src': 'client',
}
];

describe('interpretResponse', function () {
it('return empty array when no ad found', function () {
const response = {};
const request = { bidRequests: [] };
const bids = spec.interpretResponse(response, request);
expect(bids).to.have.lengthOf(0);
});

it('check response for banner and video', function () {
const bids = spec.interpretResponse(response, request);
expect(bids).to.have.lengthOf(2);
expect(bids[0].requestId).to.equal('2ee937f15015c6');
expect(bids[0].cpm).to.equal('0.2000');
expect(bids[1].cpm).to.equal('0.2000');
expect(bids[0].width).to.equal(300);
expect(bids[0].height).to.equal(600);
expect(bids[1].vastUrl).to.not.equal('');
expect(bids[0].ad).to.not.equal('');
expect(bids[1].adResponse).to.not.equal('');
expect(bids[1].renderer).not.to.be.an('undefined');
});
});

describe('On winning bid', function () {
const bids = spec.interpretResponse(response, request);
spec.onBidWon(bids);
});

describe('On bid Time out', function () {
const bids = spec.interpretResponse(response, request);
spec.onTimeout(bids);
});

describe('user sync', function () {
it('to check the user sync iframe', function () {
let syncs = spec.getUserSyncs({
iframeEnabled: true
});
expect(syncs).to.not.be.an('undefined');
expect(syncs).to.have.lengthOf(1);
expect(syncs[0].type).to.equal('iframe');
});
});
});

0 comments on commit 91146b6

Please sign in to comment.