UNPKG

rtbkit-js

Version:

Access RTBkit APIs easily with Node.js

186 lines (142 loc) 5.86 kB
# rtbkit.js Access RTBkit APIs easily with [Node.js] ## Installation rtbkit.js is available on [npm]. To install it, type: $ npm install rtbkit-js ## Usage ```js const rtbkit = require('rtbkit-js'); ``` Now we can : * launch an HTTP bidding agent, or * connect to an RTBkit instance to work with its RESTful APIs ### HTTP Bidding Agent You may create an HTTP Bidding Agent just typing a few strings: ```js const bidder = rtbkit.biddingAgent(); var PORT = 7654; var PATH = '/auctions'; bidder.bid(function(campaign, creatives, bidRequest, imp) { if (campaign == 111) { return null; // no-bid } return { price: 0.1, // bid CPM crid: creatives[0], // bid with the first allowed creative ext: { priority: 1 } // (optional) }; }); bidder.listen(PORT, PATH); ``` This bidder will response with no-bids for the campaign 111 (external-id from the bidding agent config) and will bid with 0.1 CPM for all other campaigns. The library will automatically fill down bid.id, bid.impid, and bid.ext.external-id fields. The function will be called once for each imp item and each allowed campaign that have been specified by RTBkit in the bid request. ### RTBkit RESTful APIs To connect to an RTBkit inststance type: ```js const rtb_test = rtbkit.instance("127.0.0.1"); const banker = rtb_test.banker; const acs = rtb_test.acs; ``` #### Async/await rtbkit.js might be used with the [await] operator in [async] functions: ```js async function main() { try { var pong = await banker.ping(); console.log(pong); } catch (err) { console.log(`ERR: ${err}`); } } main(); ``` #### Callbacks Or you can use a traditional callback approach. In this case you will have access to the [HTTP Response](https://nodejs.org/dist/latest-v8.x/docs/api/http.html#http_class_http_incomingmessage) object: ```js !function main() { banker.ping(function(res) { console.log(`OK (${res.statusCode}): ${res.data}`); }).on('error', function(err) { console.log(`FAIL: ${err}`); }); }(); ``` ### APIs #### [Banker API] Budgets management: ```js var pong = await banker.ping(); var summary = await banker.summary(); //gets information about all accounts await banker.budget('hello', newValue); // sets a new value for a top-level account var accounts = await banker.accounts(); // lists all accounts var account = banker.account('hello:world'); // makes a reference to the specified account. // It's an ordinary synchronous method, you don't need use await here. var hello_world = banker.account(['hello', 'world']) // the same as the previous call await account.balance(newValue); // transfers budget from the parent account to set the new value. Unacceptable for top-level accounts. var childrens = await account.children(); // gets descendants of the account await account.close(); // closes the account and all its childs. ``` ### Agent Configuration Service (ACS) API ```js var agents = await acs.agents(); // lists all agents var agent = acs.agent(agents[0]); // makes a reference to the specified agent. //It's an ordinary synchronous method, you don't need use await here. var config = await agent.config(); //gets the bidding agent's config await agent.config(newAgentConfig); // sets the new configuration for the bidding agent ``` ### Post Auction Events (a-ka [Standard Ad Server Protocol]) With the API we may implement a win notification proxy that recieves GET requests from the browser and sends POST requests into the RTBkit's via Standard Ad Server Protocol: ```js const app = require('express')(); const rtbkit = require('rtbkit-js'); const PORT = 888; const RTBKIT_HOST = '127.0.0.1'; const adserver = rtbkit.instance(RTBKIT_HOST).adserver; app.get('/win', function (req, response) { var data = { timestamp: Date.now() / 1000, bidRequestId: req.query.brid, impid: req.query.impid, price: parseFloat(req.query.price) }; adserver.win(data, function(res) { console.log(`win notice (${res.statusCode}): '${JSON.stringify(data)}'`); response.status(res.statusCode).end(); }).on('error', function(err) { console.log(`win notice error '${err.message}': '${JSON.stringify(data)}'`); response.status(500).end(); }); }); app.listen(PORT, function(){ console.log(`nurl proxy server listing on: http://localhost:${PORT}`); }); ``` Other events (clicks, conversions) will be implemented later. #### Exchange Endoints Will be implemented later. Will help to send bid requsts into the system and check responses. ### RTBkit Mock-up There is a mock server that emulates all implemented APIs. It starts locally always. ```js async function main() { try { rtbkit.mockup.start(); const banker = rtbkit.instance('127.0.0.1').banker var pong = await banker.ping(); console.log(pong); } catch (err) { console.log(`ERR: ${err}`); } } main().then(res => { rtbkit.mockup.stop(); }); ``` [Node.js]: https://nodejs.org/ [npm]: https://www.npmjs.com/ [await]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await [async]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function [Banker API]: https://github.com/rtbkit/rtbkit/wiki/Banker-JSON-API [HTTP Bidding Agents]: https://github.com/rtbkit/rtbkit/wiki/HttpBidderInterface [Standard Ad Server Protocol]: https://github.com/rtbkit/rtbkit/wiki/Standard-Ad-Server-Protocol