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 <singhabhishek....@gmail.com> wrote: > Hi Jochen, > > Full code of relevant file available - 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 <joc...@chromium.org> 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 < > singhabhishek....@gmail.com> 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 <joc...@chromium.org> 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 < >> singhabhishek....@gmail.com> 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 >>> v8-users@googlegroups.com >>> 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 v8-users+unsubscr...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> >> -- >> -- >> v8-users mailing list >> v8-users@googlegroups.com >> 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 v8-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> >> >> -- >> -- >> v8-users mailing list >> v8-users@googlegroups.com >> 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 v8-users+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > -- > v8-users mailing list > v8-users@googlegroups.com > 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 v8-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > > > -- > -- > v8-users mailing list > v8-users@googlegroups.com > 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 v8-users+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list v8-users@googlegroups.com 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 v8-users+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.