Thanks much, now things work as expected. Looking back, I think if I were thinking bit more openly it would have been an easy pattern to figure out.
> On 29-Jul-2016, at 12:04 PM, Jochen Eisinger <[email protected]> wrote: > > I commented on the example > > On Thu, Jul 28, 2016 at 2:14 PM Abhishek Singh <[email protected] > <mailto:[email protected]>> wrote: > Please find standalone code simulating your suggestion - > https://gist.github.com/abhi-bit/d3a2910ec54a47ce8294c2cc0c4bef93 > <https://gist.github.com/abhi-bit/d3a2910ec54a47ce8294c2cc0c4bef93> (In the > comment pasted output in my case). Will appreciate if you could guide using > this test script. > > >> On 28-Jul-2016, at 4:05 PM, Abhishek Singh <[email protected] >> <mailto:[email protected]>> wrote: >> >> I believe this is the change you wanted me to do: >> >> Local<Object> HTTPBody::WrapHTTPBodyMap() { >> EscapableHandleScope handle_scope(GetIsolate()); >> >> Local<FunctionTemplate> body_map_template = >> FunctionTemplate::New(GetIsolate()); >> body_map_template->InstanceTemplate()->SetHandler( >> NamedPropertyHandlerConfiguration(NULL, HTTPBodySet)); >> body_map_template->InstanceTemplate()->SetInternalFieldCount(1); >> Local<Object> result = body_map_template->GetFunction()->NewInstance(); >> >> Local<External> map_ptr = External::New(GetIsolate(), &http_body); >> >> result->SetInternalField(0, map_ptr); >> >> return handle_scope.Escape(result); >> } >> >> This didn’t help. I’ll share a standalone program that simulates problem I >> see, maybe that would help you to see what the problem could be? Would be >> some bit of effort for me, but will do given it will be very useful to have >> nested c++ maps exposed to JS. >> >>> On 28-Jul-2016, at 12:54 PM, Jochen Eisinger <[email protected] >>> <mailto:[email protected]>> wrote: >>> >>> I guess you should use function templates here. >>> >>> Local<FunctionTemplate> body_map_template = FunctionTemplate::New(isolate); >>> body_map_template->InstanceTemplate()->SetHandler(...) >>> body_map_template->InstanceTemplate()->SetInternalFieldCount(1); >>> result = body_map_template->GetFunction()->NewInstance(); >>> >>> On Wed, Jul 27, 2016 at 4:27 PM Abhishek Singh <[email protected] >>> <mailto:[email protected]>> wrote: >>> Hi Jochen, >>> >>> Full code of relevant file available - http://pastebin.com/fZJENvSi >>> <http://pastebin.com/fZJENvSi> >>> >>> Snippet of relevant portions for WrapHTTPBodyMap: >>> >>> Local<ObjectTemplate> HTTPBody::MakeHTTPBodyMapTemplate( >>> Isolate* isolate) { >>> EscapableHandleScope handle_scope(isolate); >>> >>> Local<ObjectTemplate> result = ObjectTemplate::New(isolate); >>> result->SetInternalFieldCount(1); >>> result->SetHandler(NamedPropertyHandlerConfiguration(NULL, >>> HTTPBodySet)); >>> >>> return handle_scope.Escape(result); >>> } >>> >>> Local<Object> HTTPBody::WrapHTTPBodyMap() { >>> EscapableHandleScope handle_scope(GetIsolate()); >>> >>> if (http_body_map_template_.IsEmpty()) { >>> Local<ObjectTemplate> raw_template = >>> MakeHTTPBodyMapTemplate(GetIsolate()); >>> http_body_map_template_.Reset(GetIsolate(), raw_template); >>> } >>> Local<ObjectTemplate> templ = >>> Local<ObjectTemplate>::New(GetIsolate(), http_body_map_template_); >>> >>> Local<Object> result = >>> >>> templ->NewInstance(GetIsolate()->GetCurrentContext()).ToLocalChecked(); >>> >>> Local<External> map_ptr = External::New(GetIsolate(), &http_body); >>> >>> result->SetInternalField(0, map_ptr); >>> >>> return handle_scope.Escape(result); >>> } >>> >>> >>>> On 27-Jul-2016, at 7:47 PM, Jochen Eisinger <[email protected] >>>> <mailto:[email protected]>> wrote: >>>> >>>> Can you provide a complete example? I suspect that WrapHTTPBodyMap doesn't >>>> do what you expect it does >>>> >>>> On Tue, Jul 26, 2016 at 1:04 PM Abhishek Singh >>>> <[email protected] <mailto:[email protected]>> wrote: >>>> Would you mind guiding me a bit here? For now just trying to expose nested >>>> “body” map i.e. to allow something like “response.body.result = >>>> dbQueryResult" >>>> >>>> First is the Set interceptor for “response” (C++ object) and here I’m >>>> setting up “body” (C++ object for “body”) & setting return value to “body” >>>> object. Second one is Set interceptor for “body” >>>> >>>> void HTTPResponse::HTTPResponseSet(Local<Name> name, Local<Value> >>>> value_obj, >>>> const PropertyCallbackInfo<Value>& >>>> info) { >>>> if (name->IsSymbol()) return; >>>> >>>> V8Handle* w = UnwrapV8HandleInstance(info.Holder()); >>>> HTTPBody* body = new HTTPBody(w); >>>> >>>> Local<Object> body_map = body->WrapHTTPBodyMap(); >>>> info.GetReturnValue().Set(body_map); >>>> } >>>> >>>> >>>> void HTTPBody::HTTPBodySet(Local<Name> name, Local<Value> value_obj, >>>> const PropertyCallbackInfo<Value>& info) { >>>> if (name->IsSymbol()) return; >>>> >>>> string key = ObjectToString(Local<String>::Cast(name)); >>>> string value = ToString(info.GetIsolate(), value_obj); >>>> >>>> map<string, string>* body = UnwrapMap(info.Holder()); >>>> (*body)[key] = value; >>>> >>>> cout << "body field " << value << endl; >>>> } >>>> >>>> >>>> Currently I’m not hitting Set interceptor of “body” object, I suppose I’m >>>> doing something wrong here. >>>> >>>> >>>>> On 25-Jul-2016, at 10:00 PM, Jochen Eisinger <[email protected] >>>>> <mailto:[email protected]>> wrote: >>>>> >>>> >>>>> To create dynamic nested maps from C++, the outter object (response) >>>>> would have to return another intercepted object (e.g. body) that then >>>>> returns the actual values on access. >>>>> >>>>> On Fri, Jul 22, 2016 at 8:12 AM Abhishek Singh >>>>> <[email protected] <mailto:[email protected]>> wrote: >>>>> Hi, >>>>> >>>>> I’m wondering if there is a way to expose map<string, map<string, string> >>>>> > into JS world from C++? Exposing map<string, string> looks >>>>> straightforward and I’m doing for some C++ objects using >>>>> NamedPropertyConfigurationHandler. I’ll just show sample JS code that I >>>>> would like to have and where C++ map<string, map<string, string> > will >>>>> come into picture: >>>>> >>>>> function OnHTTPGet(request, response) { >>>>> >>>>> var city = “BLR”; >>>>> var limit = “10”; >>>>> >>>>> var queryResult = dbCal(“select * from users where city=${city} >>>>> limit ${limit}”); >>>>> >>>>> // This works for me presently >>>>> /* response.data = queryResult; >>>>> response.status_code = 200; */ >>>>> >>>>> // What I would like to have >>>>> response.body.data = queryResult; >>>>> response.header.status_code = 200; >>>>> } >>>>> >>>>> “request” - native HTTP request JSON passed from C++ V8 binding as args >>>>> to JS function >>>>> “response” - C++ based HTTP object exposed with Setter callback set using >>>>> NamedPropertyConfigHandler and this what I write back to user who made >>>>> the “request" >>>>> >>>>> I basically want to set HTTP response body and header transparently, >>>>> which would require me to expose C++ HTTP object probably as a >>>>> map<string, map<string, string> >. Hope my question is clear, please let >>>>> me know if there a way to do this? >>>>> >>>>> Thanks, >>>>> Abhishek >>>>> >>>>> -- >>>>> -- >>>>> v8-users mailing list >>>>> [email protected] <mailto:[email protected]> >>>>> http://groups.google.com/group/v8-users >>>>> <http://groups.google.com/group/v8-users> >>>>> --- >>>>> You received this message because you are subscribed to the Google Groups >>>>> "v8-users" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send an >>>>> email to [email protected] >>>>> <mailto:v8-users%[email protected]>. >>>>> For more options, visit https://groups.google.com/d/optout >>>>> <https://groups.google.com/d/optout>. >>>>> >>>>> -- >>>>> -- >>>>> v8-users mailing list >>>>> [email protected] <mailto:[email protected]> >>>>> http://groups.google.com/group/v8-users >>>>> <http://groups.google.com/group/v8-users> >>>>> --- >>>>> You received this message because you are subscribed to the Google Groups >>>>> "v8-users" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send an >>>>> email to [email protected] >>>>> <mailto:[email protected]>. >>>>> For more options, visit https://groups.google.com/d/optout >>>>> <https://groups.google.com/d/optout>. >>>> >>>> >>>> -- >>>> -- >>>> v8-users mailing list >>>> [email protected] <mailto:[email protected]> >>>> http://groups.google.com/group/v8-users >>>> <http://groups.google.com/group/v8-users> >>>> --- >>>> You received this message because you are subscribed to the Google Groups >>>> "v8-users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send an >>>> email to [email protected] >>>> <mailto:[email protected]>. >>>> For more options, visit https://groups.google.com/d/optout >>>> <https://groups.google.com/d/optout>. >>>> >>>> -- >>>> -- >>>> v8-users mailing list >>>> [email protected] <mailto:[email protected]> >>>> http://groups.google.com/group/v8-users >>>> <http://groups.google.com/group/v8-users> >>>> --- >>>> You received this message because you are subscribed to the Google Groups >>>> "v8-users" group. >>>> To unsubscribe from this group and stop receiving emails from it, send an >>>> email to [email protected] >>>> <mailto:[email protected]>. >>>> For more options, visit https://groups.google.com/d/optout >>>> <https://groups.google.com/d/optout>. >>> >>> >>> -- >>> -- >>> v8-users mailing list >>> [email protected] <mailto:[email protected]> >>> http://groups.google.com/group/v8-users >>> <http://groups.google.com/group/v8-users> >>> --- >>> You received this message because you are subscribed to the Google Groups >>> "v8-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to [email protected] >>> <mailto:[email protected]>. >>> For more options, visit https://groups.google.com/d/optout >>> <https://groups.google.com/d/optout>. >>> >>> -- >>> -- >>> v8-users mailing list >>> [email protected] <mailto:[email protected]> >>> http://groups.google.com/group/v8-users >>> <http://groups.google.com/group/v8-users> >>> --- >>> You received this message because you are subscribed to the Google Groups >>> "v8-users" group. >>> To unsubscribe from this group and stop receiving emails from it, send an >>> email to [email protected] >>> <mailto:[email protected]>. >>> For more options, visit https://groups.google.com/d/optout >>> <https://groups.google.com/d/optout>. >> > > > -- > -- > v8-users mailing list > [email protected] <mailto:[email protected]> > http://groups.google.com/group/v8-users > <http://groups.google.com/group/v8-users> > --- > You received this message because you are subscribed to the Google Groups > "v8-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] > <mailto:[email protected]>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. > > -- > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > <http://groups.google.com/group/v8-users> > --- > You received this message because you are subscribed to the Google Groups > "v8-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected] > <mailto:[email protected]>. > For more options, visit https://groups.google.com/d/optout > <https://groups.google.com/d/optout>. -- -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
