![]() |
RTBKit
0.9
Open-source framework to create real-time ad bidding systems.
|
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