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.

Reply via email to