Enable Harmony Proxies in nodejs
Asked Answered
S

5

20

Is it possible to enable EcmaScript 6 Harmony Proxies in nodejs? If so, what are the pros and cons? And is there any documentation on how to use them? Thanks !

Sailmaker answered 19/5, 2012 at 14:11 Comment(0)
R
20

Invoking node with node --harmony-proxies should do the trick.

Pros: proxies are a very powerful feature when you really need them.

Cons: proxies are a much too powerful feature when you don't need them (which should be most of the time). Also, the implementation should still be regarded experimental.

As for documentation, all there really is atm is the Harmony wiki, in particular this page, which reflects the current implementation of proxies in V8 (and thus node):

http://wiki.ecmascript.org/doku.php?id=harmony:proxies

Ravish answered 19/5, 2012 at 16:19 Comment(3)
This indeed was necessary, however I still had trouble getting it to work. The following thread and example was also very useful: github.com/joyent/node/issues/4138Casteel
What is "much too powerful" about such a feature?Glaucoma
UPDATE 2015/10/12: As of now, V8 does not yet support ES6 new Proxy() handler, you will have to use Proxy.create() instead or you can use this shim to alias the function call for youOsbourn
A
2

i recommend harmony-reflect, which makes it easy to e.g. set up get/set traps:

UPDATE careful, below is CoffeeScript

require 'harmony-reflect'

handler =

  get: ( target, name ) ->
    console.log 'get' name
    return target[ name ]

  set: ( target, name, value ) ->
    console.log 'set' name
    target[ '%is-clean' ] = no if value isnt target[ name ]
    if value is undefined then delete target[ name ]
    else                       target[ name ] = value
    return value

clean = ( x ) ->
  x[ '%is-clean' ] = yes
  return x

p = Proxy {}, handler
p[ 'a' ] = 1
p[ 'b' ] = undefined
console.log p[ 'a' ], p[ 'b' ]
console.log "c" of p, p[ 'c' ]
console.log p
clean p
p[ 'a' ] = 1
console.log p
p[ 'a' ] = 42
console.log p

the above is the inceptive code to do 'transparent object persistence' in JavaScript. using harmony-reflect, it becomes trivial to make it so that all get and set actions on an object get intercepted—in this demo, we set an %is-clean attribute so we can test whether object members have been changed, and we also delete members that have been set to undefined.

Albina answered 19/9, 2013 at 16:15 Comment(5)
this is not JavaScriptAdulterant
correct. the question was on NodeJS, not JavaScript. CoffeeScript compiles to JavaScript; you can copy-and-paste above code to js2coffee.org (second tab) if you prefer JS over CS.Albina
well, it would be nice to have ecmascript-harmony code here as the question is tagged as such.Adulterant
I don't get why this gets downvoted ... I'm just now working on a node-cli coffeescript thingy using harmony, or parts of it ... this is exactly what I need. thxJemmie
Coffescript is NOT JS @JemmieDisenthrall
A
1

You can use pimped-proxy which a lightweight implementation of proxies, making declaration easier and ES5 compatible. Unlike the native Proxy, it can only proxy properties known at creation time.

https://github.com/Boulangerie/pimped-proxy

Archive answered 10/12, 2016 at 9:8 Comment(0)
A
1

Proxy is now available natively in Node versions >= 6.

Antibaryon answered 8/3, 2017 at 21:16 Comment(2)
Do you have a source for that?Spaceless
I did at the time, try the change log on the NodeJS site, pretty sure it was thereAntibaryon
P
-11

Harmony Proxies won't work all that well for nodejs because they're effectively synchronous type function calls. That is, you can't implement a proxy method that's async.

See this GitHub repository for examples: https://github.com/mschwartz/SilkJS-Harmony

Production answered 8/11, 2012 at 16:42 Comment(6)
I don't quite follow what you are saying. Surely, the get trap can return an async function as a "method"?Ravish
Harmony code looks like: foo = proxy_thing.some_member; some_member is a function call. I don't know how it could be async.Production
SilkJS Fan, I don't think evert function call needs to be async — just don't do IO inside and that's all.Penholder
Not every function call needs to be async, and you can use proxies for primitive kinds of things in a sync manner with nodejs. However, if you're familiar with the tie keyword in Perl, it would be a perfect use case for Harmony Proxies, but you'd have to sync get your value by key from redis (for example) synchronously.Production
proxies and (a)synchronicity are as orthogonal concepts as, say, cheese sandwiches and bank holidays.Albina
To add to the discussion on why this answer is wrong, the upcoming async await will allow you to return values from a getter using a synchronous-like pattern. Until then, there are node-fibers and generators that can also do this.Satan

© 2022 - 2024 — McMap. All rights reserved.