RTBKit  0.9
Open-source framework to create real-time ad bidding systems.
soa/service/js/service_base_js.cc
00001 
00009 #include "service_base_js.h"
00010 #include "soa/service/js/opstats_js.h"
00011 #include "soa/js/js_call.h"
00012 #include "soa/sigslot/slot.h"
00013 
00014 using namespace std;
00015 using namespace v8;
00016 
00017 namespace Datacratic {
00018 namespace JS {
00019 
00020 
00021 /******************************************************************************/
00022 /* SERVICE PROXIES                                                            */
00023 /******************************************************************************/
00024 
00025 extern const char* const ServiceProxiesName;
00026 const char * const ServiceProxiesName = "ServiceProxies";
00027 
00028 struct ServiceProxiesJS :
00029     public JSWrapped2<
00030         ServiceProxies,
00031         ServiceProxiesJS,
00032         ServiceProxiesName,
00033         serviceModule>
00034 {
00035     ServiceProxiesJS() {}
00036 
00037     ServiceProxiesJS(
00038             v8::Handle<v8::Object> This,
00039             const std::shared_ptr<ServiceProxies>& proxies =
00040                 std::shared_ptr<ServiceProxies>())
00041     {
00042         HandleScope scope;
00043         wrap(This, proxies);
00044     }
00045 
00046     static Handle<v8::Value>
00047     New(const Arguments& args)
00048     {
00049         try {
00050             auto obj = ML::make_std_sp(new ServiceProxies());
00051             new ServiceProxiesJS(args.This(), obj);
00052 
00053             return args.This();
00054         }
00055         HANDLE_JS_EXCEPTIONS;
00056     }
00057 
00058 
00059     static void
00060     Initialize()
00061     {
00062         Persistent<FunctionTemplate> t = Register(New);
00063 
00064         NODE_SET_PROTOTYPE_METHOD(t, "logToCarbon", logToCarbon);
00065         registerMemberFn(&Datacratic::ServiceProxies::useZookeeper, "useZookeeper");
00066         registerMemberFn(&Datacratic::ServiceProxies::getServiceClassInstances, "getServiceClassInstances");
00067     }
00068 
00069     static Handle<Value>
00070     logToCarbon(const Arguments& args)
00071     {
00072         try {
00073             ExcCheck(args.Length() >= 1, "Invalid arguments");
00074 
00075             if (args[0]->IsString()) {
00076                 string carbonURI = getArg<string>(args, 0, "carbonConnection");
00077                 string prefix = getArg<string>(args, 1, "", "prefix");
00078                 getShared(args)->logToCarbon(carbonURI, prefix);
00079             }
00080             else {
00081                 auto conn = getArg<std::shared_ptr<CarbonConnector> >(
00082                         args, 0, "carbonConnector");
00083 
00084                 getShared(args)->logToCarbon(conn);
00085             }
00086 
00087             return Handle<Value>();
00088         } HANDLE_JS_EXCEPTIONS;
00089     }
00090 
00091 };
00092 
00093 std::shared_ptr<ServiceProxies>
00094 from_js(const JSValue& value, std::shared_ptr<ServiceProxies>*)
00095 {
00096     return ServiceProxiesJS::fromJS(value);
00097 }
00098 
00099 std::shared_ptr<ServiceProxies>
00100 from_js_ref(const JSValue& value, std::shared_ptr<ServiceProxies>*)
00101 {
00102     return ServiceProxiesJS::fromJS(value);
00103 }
00104 
00105 ServiceProxies*
00106 from_js(const JSValue& value, ServiceProxies**)
00107 {
00108     return ServiceProxiesJS::fromJS(value).get();
00109 }
00110 
00111 void
00112 to_js(JS::JSValue& value, const std::shared_ptr<ServiceProxies>& proxies)
00113 {
00114     value = ServiceProxiesJS::toJS(proxies);
00115 }
00116 
00117 std::shared_ptr<ServiceProxies>
00118 getServiceProxiesSharedPointer(const JS::JSValue & value)
00119 {
00120     if(ServiceProxiesJS::tmpl->HasInstance(value))
00121     {
00122         std::shared_ptr<ServiceProxies> proxies =
00123             ServiceProxiesJS::getSharedPtr(value);
00124         return proxies;
00125     }
00126     std::shared_ptr<ServiceProxies> proxies;
00127     return proxies;
00128 }
00129 
00130 
00131 
00132 /******************************************************************************/
00133 /* SERVICE BASE                                                               */
00134 /******************************************************************************/
00135 
00136 const char * const ServiceBaseName = "ServiceBase";
00137 
00138 ServiceBaseJS::
00139 ServiceBaseJS()
00140 {}
00141 
00142 ServiceBaseJS::
00143 ServiceBaseJS(
00144         v8::Handle<v8::Object> This,
00145         const std::shared_ptr<ServiceBase>& service)
00146 {
00147     HandleScope scope;
00148     wrap(This, service);
00149 }
00150 
00151 Handle<v8::Value>
00152 ServiceBaseJS::
00153 New(const Arguments& args)
00154 {
00155     try {
00156         ExcCheck(args.Length() == 2, "Invalid arguments");
00157 
00158         string serviceName = getArg<string>(args, 0, "serviceName");
00159         auto proxies = getArg<std::shared_ptr<ServiceProxies> >(
00160                 args, 1, "proxies");
00161 
00162         auto obj = ML::make_std_sp(new ServiceBase(serviceName, proxies));
00163         new ServiceBaseJS(args.This(), obj);
00164 
00165         return args.This();
00166     }
00167     HANDLE_JS_EXCEPTIONS;
00168 }
00169 
00170 
00171 void
00172 ServiceBaseJS::
00173 Initialize()
00174 {
00175     Persistent<FunctionTemplate> t = Register(New);
00176 
00177     NODE_SET_PROTOTYPE_METHOD(t, "recordHit", recordHit);
00178     NODE_SET_PROTOTYPE_METHOD(t, "recordCount", recordCount);
00179     NODE_SET_PROTOTYPE_METHOD(t, "recordOutcome", recordOutcome);
00180     NODE_SET_PROTOTYPE_METHOD(t, "recordLevel", recordLevel);
00181 }
00182 
00183 Handle<Value>
00184 ServiceBaseJS::
00185 recordHit(const Arguments& args)
00186 {
00187     try {
00188         for (int i = 0; i < args.Length(); ++i) {
00189             string event = getArg<string>(args, i, "event");
00190             getShared(args)->recordHit(event);
00191         }
00192         return Handle<Value>();
00193     } HANDLE_JS_EXCEPTIONS;
00194 }
00195 
00196 Handle<Value>
00197 ServiceBaseJS::
00198 recordCount(const Arguments& args)
00199 {
00200     try {
00201         float count = getArg<float>(args, 0, "count");
00202 
00203         for (int i = 1; i < args.Length(); ++i) {
00204             string event = getArg<string>(args, i, "event");
00205             getShared(args)->recordCount(count, event);
00206         }
00207         return Handle<Value>();
00208     } HANDLE_JS_EXCEPTIONS;
00209 }
00210 
00211 Handle<Value>
00212 ServiceBaseJS::
00213 recordOutcome(const Arguments& args)
00214 {
00215     try {
00216         float count = getArg<float>(args, 0, "outcome");
00217 
00218         for (int i = 1; i < args.Length(); ++i) {
00219             string event = getArg<string>(args, i, "event");
00220             getShared(args)->recordOutcome(count, event);
00221         }
00222         return Handle<Value>();
00223     } HANDLE_JS_EXCEPTIONS;
00224 }
00225 
00226 Handle<Value>
00227 ServiceBaseJS::
00228 recordLevel(const Arguments& args)
00229 {
00230     try {
00231         float count = getArg<float>(args, 0, "outcome");
00232 
00233         for (int i = 1; i < args.Length(); ++i) {
00234             string event = getArg<string>(args, i, "event");
00235             getShared(args)->recordLevel(count, event);
00236         }
00237         return Handle<Value>();
00238     } HANDLE_JS_EXCEPTIONS;
00239 }
00240 
00241 
00242 std::shared_ptr<ServiceBase>
00243 from_js(const JSValue& value, std::shared_ptr<ServiceBase>*)
00244 {
00245     return ServiceBaseJS::fromJS(value);
00246 }
00247 
00248 std::shared_ptr<ServiceBase>
00249 from_js_ref(const JSValue& value, std::shared_ptr<ServiceBase>*)
00250 {
00251     return ServiceBaseJS::fromJS(value);
00252 }
00253 
00254 ServiceBase*
00255 from_js(const JSValue& value, ServiceBase**)
00256 {
00257     return ServiceBaseJS::fromJS(value).get();
00258 }
00259 
00260 void
00261 to_js(JS::JSValue& value, const std::shared_ptr<ServiceBase>& service)
00262 {
00263     value = ServiceBaseJS::toJS(service);
00264 }
00265 
00266 std::shared_ptr<ServiceBase>
00267 getServiceBaseSharedPointer(const JS::JSValue & value)
00268 {
00269     if(ServiceBaseJS::tmpl->HasInstance(value))
00270     {
00271         std::shared_ptr<ServiceBase> service =
00272             ServiceBaseJS::getSharedPtr(value);
00273         return service;
00274     }
00275     std::shared_ptr<ServiceBase> service;
00276     return service;
00277 }
00278 
00279 
00280 
00281 
00282 
00283 
00284 } // namepsace JS
00285 } // namespace Datacratic
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator