Skip to content

Commit

Permalink
YieldOne Bid Adapter: update documentation, test and code style (preb…
Browse files Browse the repository at this point in the history
…id#9233)

* add parameter test

* change new_format to single_format

* fix adomain typo

* add parameter test

* add jsdoc comment and update readme

* change @return to @returns

* change param and returns

* add typeof and change param/returns

* change returns value

* change flux to 1x1

Co-authored-by: TakuhoSanpei <takuho-sanpei@dac.co.jp>
  • Loading branch information
2 people authored and JacobKlein26 committed Feb 8, 2023
1 parent 39aed8c commit 2b21f54
Show file tree
Hide file tree
Showing 3 changed files with 199 additions and 23 deletions.
68 changes: 60 additions & 8 deletions modules/yieldoneBidAdapter.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,17 @@ import {registerBidder} from '../src/adapters/bidderFactory.js';
import { Renderer } from '../src/Renderer.js';
import { BANNER, VIDEO } from '../src/mediaTypes.js';

/**
* @typedef {import('../src/adapters/bidderFactory').Bid} Bid
* @typedef {import('../src/adapters/bidderFactory').BidRequest} BidRequest
* @typedef {import('../src/adapters/bidderFactory').BidderSpec} BidderSpec
* @typedef {import('../src/adapters/bidderFactory').ServerRequest} ServerRequest
* @typedef {import('../src/adapters/bidderFactory').ServerResponse} ServerResponse
* @typedef {import('../src/adapters/bidderFactory').SyncOptions} SyncOptions
* @typedef {import('../src/adapters/bidderFactory').UserSync} UserSync
* @typedef {import('../src/auction').BidderRequest} BidderRequest
*/

const BIDDER_CODE = 'yieldone';
const ENDPOINT_URL = 'https://y.one.impact-ad.jp/h_bid';
const USER_SYNC_URL = 'https://y.one.impact-ad.jp/push_sync';
Expand All @@ -13,13 +24,25 @@ const VIEWABLE_PERCENTAGE_URL = 'https://img.ak.impact-ad.jp/ic/pone/ivt/firstvi

const DEFAULT_VIDEO_SIZE = {w: 640, h: 360};

/** @type BidderSpec */
export const spec = {
code: BIDDER_CODE,
aliases: ['y1'],
supportedMediaTypes: [BANNER, VIDEO],
/**
* Determines whether or not the given bid request is valid.
* @param {BidRequest} bid The bid params to validate.
* @returns {boolean} True if this is a valid bid, and false otherwise.
*/
isBidRequestValid: function(bid) {
return !!(bid.params.placementId);
},
/**
* Make a server request from the list of BidRequests.
* @param {Bid[]} validBidRequests - An array of bids.
* @param {BidderRequest} bidderRequest - bidder request object.
* @returns {ServerRequest|ServerRequest[]} ServerRequest Info describing the request to the server.
*/
buildRequests: function(validBidRequests, bidderRequest) {
return validBidRequests.map(bidRequest => {
const params = bidRequest.params;
Expand Down Expand Up @@ -96,6 +119,12 @@ export const spec = {
};
});
},
/**
* Unpack the response from the server into a list of bids.
* @param {ServerResponse} serverResponse - A successful response from the server.
* @param {BidRequest} bidRequests
* @returns {Bid[]} - An array of bids which were nested inside the server.
*/
interpretResponse: function(serverResponse, bidRequest) {
const bidResponses = [];
const response = serverResponse.body;
Expand Down Expand Up @@ -188,6 +217,11 @@ export const spec = {
}
return bidResponses;
},
/**
* Register the user sync pixels which should be dropped after the auction.
* @param {SyncOptions} syncOptions Which user syncs are allowed?
* @returns {UserSync[]} The user syncs which should be dropped.
*/
getUserSyncs: function(syncOptions) {
if (syncOptions.iframeEnabled) {
return [{
Expand All @@ -202,7 +236,7 @@ export const spec = {
* NOTE: server side does not yet support multiple formats.
* @param {Object} bidRequest -
* @param {boolean} [enabledOldFormat = true] - default: `true`.
* @return {string|null} - `"banner"` or `"video"` or `null`.
* @returns {string|null} - `"banner"` or `"video"` or `null`.
*/
function getMediaType(bidRequest, enabledOldFormat = true) {
let hasBannerType = Boolean(deepAccess(bidRequest, 'mediaTypes.banner'));
Expand Down Expand Up @@ -239,7 +273,7 @@ function getMediaType(bidRequest, enabledOldFormat = true) {
* @param {Object} bidRequest.banner -
* @param {Array<string>} bidRequest.banner.sizes -
* @param {boolean} [enabledOldFormat = true] - default: `true`.
* @return {string} - strings like `"300x250"` or `"300x250,728x90"`.
* @returns {string} - strings like `"300x250"` or `"300x250,728x90"`.
*/
function getBannerSizes(bidRequest, enabledOldFormat = true) {
let sizes = deepAccess(bidRequest, 'mediaTypes.banner.sizes');
Expand All @@ -254,10 +288,10 @@ function getBannerSizes(bidRequest, enabledOldFormat = true) {
/**
* @param {Object} bidRequest -
* @param {boolean} [enabledOldFormat = true] - default: `true`.
* @param {boolean} [enabledFlux = true] - default: `true`.
* @return {{w: number, h: number}} -
* @param {boolean} [enabled1x1 = true] - default: `true`.
* @returns {{w: number, h: number}} -
*/
function getVideoSize(bidRequest, enabledOldFormat = true, enabledFlux = true) {
function getVideoSize(bidRequest, enabledOldFormat = true, enabled1x1 = true) {
/**
* @param {Array<number, number> | Array<Array<number, number>>} sizes -
* @return {{w: number, h: number} | null} -
Expand Down Expand Up @@ -287,17 +321,22 @@ function getVideoSize(bidRequest, enabledOldFormat = true, enabledFlux = true) {
playerSize = playerSize || _getPlayerSize(bidRequest.sizes);
}

if (enabledFlux) {
// NOTE: `video.playerSize` in Flux is always [1,1].
if (enabled1x1) {
// NOTE: `video.playerSize` in 1x1 is always [1,1].
if (playerSize && (playerSize.w === 1 && playerSize.h === 1)) {
// NOTE: `params.playerSize` is a specific object to support `FLUX`.
// NOTE: `params.playerSize` is a specific object to support `1x1`.
playerSize = _getPlayerSize(deepAccess(bidRequest, 'params.playerSize'));
}
}

return playerSize || DEFAULT_VIDEO_SIZE;
}

/**
* Create render for outstream video.
* @param {Object} serverResponse.body -
* @returns {Renderer} - Prebid Renderer object
*/
function newRenderer(response) {
const renderer = Renderer.install({
id: response.uid,
Expand All @@ -314,12 +353,21 @@ function newRenderer(response) {
return renderer;
}

/**
* Handles an outstream response after the library is loaded
* @param {Object} bid
*/
function outstreamRender(bid) {
bid.renderer.push(() => {
window.DACIVTPREBID.renderPrebid(bid);
});
}

/**
* Create render for cmer outstream video.
* @param {Object} serverResponse.body -
* @returns {Renderer} - Prebid Renderer object
*/
function newCmerRenderer(response) {
const renderer = Renderer.install({
id: response.uid,
Expand All @@ -336,6 +384,10 @@ function newCmerRenderer(response) {
return renderer;
}

/**
* Handles an outstream response after the library is loaded
* @param {Object} bid
*/
function cmerRender(bid) {
bid.renderer.push(() => {
window.CMERYONEPREBID.renderPrebid(bid);
Expand Down
118 changes: 109 additions & 9 deletions modules/yieldoneBidAdapter.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,7 @@ Connect to YIELDONE for bids.
THE YIELDONE adapter requires setup and approval from the YIELDONE team.
Please reach out to your account team or y1s@platform-one.co.jp for more information.

Note: THE YIELDONE adapter do not support "multi-format" scenario... if both
banner and video are specified as mediatypes, YIELDONE will treat it as a video unit.
YIELDONE adapter supports Banner, Video and Multi-Format(video, banner) currently.

# Test Parameters
```javascript
Expand All @@ -24,13 +23,16 @@ var adUnits = [
code: 'banner-div',
mediaTypes: {
banner: {
sizes: [[300, 250], [336, 280]]
sizes: [
[300, 250],
[336, 280]
]
}
},
bids: [{
bidder: 'yieldone',
params: {
placementId: '36891'
placementId: '36891' // required
}
}]
},
Expand All @@ -44,11 +46,109 @@ var adUnits = [
},
},
bids: [{
bidder: 'yieldone',
params: {
placementId: '41993'
}
}]
bidder: "yieldone",
params: {
placementId: "36892", // required
playerParams: { // optional
wrapperWidth: "320px", // optional
wrapperHeight: "180px" // optional
},
}
}]
},
// Video adUnit(mediaTypes.video.playerSize: [1,1])
{
code: 'video-1x1-div',
mediaTypes: {
video: {
playerSize: [[1, 1]],
context: 'outstream'
},
},
bids: [{
bidder: 'yieldone',
params: {
placementId: "36892", // required
playerSize: [640, 360], // required
playerParams: { // optional
wrapperWidth: "320px", // optional
wrapperHeight: "180px" // optional
},
}
}]
},
// Multi-Format adUnit
{
code: "multi-format-div",
mediaTypes: {
banner: {
sizes: [
[300, 250],
[1, 1]
]
},
video: {
playerSize: [640, 360],
context: "outstream"
}
},
bids: [{
// * "video" bid object should be placed before "banner" bid object.
// This bid will request a "video" media type ad.
bidder: "yieldone",
params: {
placementId: "36892", // required
playerParams: { // required
wrapperWidth: "320px", // optional
wrapperHeight: "180px" // optional
},
}
},
{
// This bid will request a "banner" media type ad.
bidder: "yieldone",
params: {
placementId: "36891" // required
}
}
]
},
// Multi-Format adUnit(mediaTypes.video.playerSize: [1,1])
{
code: "multi-format-1x1-div",
mediaTypes: {
banner: {
sizes: [
[300, 250],
[1, 1]
]
},
video: {
playerSize: [1, 1],
context: "outstream"
}
},
bids: [{
// * "video" bid object should be placed before "banner" bid object.
// This bid will request a "video" media type ad.
bidder: "yieldone",
params: {
placementId: "36892", // required
playerSize: [640, 360], // required
playerParams: { // required
wrapperWidth: "320px", // optional
wrapperHeight: "180px" // optional
},
}
},
{
// This bid will request a "banner" media type ad.
bidder: "yieldone",
params: {
placementId: "36891" // required
}
}
]
}
```

Expand Down
Loading

0 comments on commit 2b21f54

Please sign in to comment.