RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
js/auction_js.cc
00001 /* auction_js.cc
00002    Jeremy Barnes, 6 April 2011
00003    Copyright (c) 2011 Datacratic.  All rights reserved.
00004 
00005    Auctions.
00006 */
00007 
00008 
00009 #include "auction_js.h"
00010 #include "bid_request_js.h"
00011 #include "soa/js/js_wrapped.h"
00012 #include "jml/utils/smart_ptr_utils.h"
00013 #include "soa/types/js/id_js.h"
00014 
00015 using namespace std;
00016 using namespace v8;
00017 using namespace node;
00018 
00019 namespace Datacratic {
00020 namespace JS {
00021 
00022 /*****************************************************************************/
00023 /* AUCTION JS                                                                */
00024 /*****************************************************************************/
00025 
00026 const char * AuctionName = "Auction";
00027 
00028 struct AuctionJS
00029     : public JSWrapped2<Auction, AuctionJS, AuctionName,
00030                         rtbModule> {
00031     
00032     AuctionJS(v8::Handle<v8::Object> This,
00033               const std::shared_ptr<Auction> & bid
00034               = std::shared_ptr<Auction>())
00035     {
00036         HandleScope scope;
00037         wrap(This, bid);
00038     }
00039 
00040     static Handle<v8::Value>
00041     New(const Arguments & args)
00042     {
00043         try {
00044             new AuctionJS(args.This(), ML::make_std_sp(new Auction()));
00045             return args.This();
00046         } HANDLE_JS_EXCEPTIONS;
00047     }
00048 
00049     static void
00050     Initialize()
00051     {
00052         Persistent<FunctionTemplate> t = Register(New);
00053         NODE_SET_PROTOTYPE_METHOD(t, "setRequest", setRequest);
00054         //NODE_SET_PROTOTYPE_METHOD(t, "getResponse", getResponse);
00055         NODE_SET_PROTOTYPE_METHOD(t, "notifyNoMoreBids", finish);
00056         NODE_SET_PROTOTYPE_METHOD(t, "finish", finish);
00057 
00058         RWPropertyHandler<AuctionJS, Auction, Date, &Auction::start>
00059             handleStart(t, "start");
00060         RWPropertyHandler<AuctionJS, Auction, Date, &Auction::expiry>
00061             handleExpiry(t, "expiry");
00062         RWPropertyHandler<AuctionJS, Auction, Id, &Auction::id>
00063             handleId(t, "id");
00064 
00065         t->InstanceTemplate()
00066             ->SetAccessor(String::NewSymbol("request"), requestGetter,
00067                           requestSetter, v8::Handle<v8::Value>(), DEFAULT,
00068                           PropertyAttribute(DontDelete));
00069 
00070         t->InstanceTemplate()
00071             ->SetAccessor(String::NewSymbol("requestStr"), requestStrGetter,
00072                           requestStrSetter, v8::Handle<v8::Value>(), DEFAULT,
00073                           PropertyAttribute(DontDelete));
00074 
00075         t->InstanceTemplate()
00076             ->SetAccessor(String::NewSymbol("tooLate"), tooLateGetter,
00077                           0, v8::Handle<v8::Value>(), DEFAULT,
00078                           PropertyAttribute(ReadOnly | DontDelete));
00079 
00080         t->InstanceTemplate()
00081             ->SetAccessor(String::NewSymbol("responses"), responseGetter,
00082                           0, v8::Handle<v8::Value>(), DEFAULT,
00083                           PropertyAttribute(ReadOnly | DontDelete));
00084     }
00085 
00086     static v8::Handle<v8::Value>
00087     requestGetter(v8::Local<v8::String> property,
00088                   const v8::AccessorInfo & info)
00089     {
00090         try {
00091             JSValue result;
00092             to_js(result, getShared(info.This())->request);
00093             return result;
00094         } HANDLE_JS_EXCEPTIONS;
00095     }
00096 
00097     static void
00098     requestSetter(v8::Local<v8::String> property,
00099                   v8::Local<v8::Value> value,
00100                   const v8::AccessorInfo & info)
00101     {
00102         try {
00103             std::shared_ptr<BidRequest> br
00104                 = getBidRequestSharedPointer(value);
00105             if (br) {
00106                 getShared(info.This())->request = br;
00107             }
00108             else if (value->IsString()) {
00109 
00110                 string s = cstr(value);
00111                 getShared(info.This())->request
00112                     .reset(BidRequest::parse("datacratic", s));
00113                 getShared(info.This())->requestStr = s;
00114             }
00115             else {
00116                 Json::Value request = JS::fromJS(value);
00117 
00118                 string s = request.toString();
00119                 getShared(info.This())->request
00120                     .reset(BidRequest::parse("datacratic", s));
00121                 getShared(info.This())->requestStr = s;
00122 
00123             }
00124         } HANDLE_JS_EXCEPTIONS_SETTER;
00125     }
00126 
00127     static v8::Handle<v8::Value>
00128     requestStrGetter(v8::Local<v8::String> property,
00129                   const v8::AccessorInfo & info)
00130     {
00131         try {
00132             return JS::toJS(getShared(info.This())->requestStr);
00133         } HANDLE_JS_EXCEPTIONS;
00134     }
00135 
00136     static void
00137     requestStrSetter(v8::Local<v8::String> property,
00138                   v8::Local<v8::Value> value,
00139                   const v8::AccessorInfo & info)
00140     {
00141         try {
00142             Json::Value request = JS::fromJS(value);
00143             string s = request.toString();
00144             getShared(info.This())->request
00145                 .reset(BidRequest::parse("datacratic", s));
00146             getShared(info.This())->requestStr = s;
00147 
00148         } HANDLE_JS_EXCEPTIONS_SETTER;
00149     }
00150 
00151     static v8::Handle<v8::Value>
00152     tooLateGetter(v8::Local<v8::String> property,
00153                   const v8::AccessorInfo & info)
00154     {
00155         try {
00156             return v8::Boolean::New(getShared(info.This())->tooLate());
00157         } HANDLE_JS_EXCEPTIONS;
00158     }
00159 
00160     static v8::Handle<v8::Value>
00161     responseGetter(v8::Local<v8::String> property,
00162                    const v8::AccessorInfo & info)
00163     {
00164         HandleScope scope;
00165         try {
00166             const auto & auction = *getShared(info.This());
00167             vector<vector<Auction::Response> > responses
00168                 = auction.getResponses();
00169 
00170             vector<vector<Json::Value> > respjson(responses.size());
00171             for (unsigned spotNum = 0;  spotNum < responses.size();
00172                  ++spotNum) {
00173                 for (auto it = responses[spotNum].begin(),
00174                          end = responses[spotNum].end();
00175                      it != end;  ++it)
00176                     respjson[spotNum].push_back(it->toJson());
00177             }
00178             return scope.Close(JS::toJS(respjson));
00179         } HANDLE_JS_EXCEPTIONS;
00180     }
00181 
00182     static Handle<v8::Value>
00183     setRequest(const Arguments & args)
00184     {
00185         try {
00186             Json::Value request = getArg(args, 0, "request");
00187             string s = request.toString();
00188             std::shared_ptr<BidRequest> newRequest
00189                 (BidRequest::parse("datacratic", s));
00190             getShared(args)->request = newRequest;
00191             getShared(args)->requestStr = s;
00192             return args.This();
00193         } HANDLE_JS_EXCEPTIONS;
00194     }
00195 
00196     static Handle<v8::Value>
00197     getResponse(const Arguments & args)
00198     {
00199         try {
00200             return JS::toJS(getShared(args)->getResponseJson(getArg(args, 0, "slotNum")));
00201         } HANDLE_JS_EXCEPTIONS;
00202     }
00203 
00204     static Handle<v8::Value>
00205     finish(const Arguments & args)
00206     {
00207         try {
00208             getShared(args)->finish();
00209             return args.This();
00210         } HANDLE_JS_EXCEPTIONS;
00211     }
00212 };
00213 
00214 
00215 std::shared_ptr<Auction>
00216 from_js(const JSValue & value, std::shared_ptr<Auction> *)
00217 {
00218     return AuctionJS::fromJS(value);
00219 }
00220 
00221 Auction *
00222 from_js(const JSValue & value, Auction **)
00223 {
00224     return AuctionJS::fromJS(value).get();
00225 }
00226 
00227 
00228 } // namespace JS
00229 } // namespace Datacratic
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator