Thanks John. I agree - best to clean up the docs first. I'll try to find all the places that could use clarification and create a patch.
Ivan On Thu, Oct 29, 2009 at 17:57, John Hjelmstad <[email protected]> wrote: > Put simply, it's not implemented right now. The G <-> G js doc was put in > there a looong time ago, and the spec probably used it as inspiration. My > guess is that nobody really ever cared enough about direct G <-> G > communication to fix the js docs -- fixing the spec is a spec update of > course, discussion for [email protected]. > As noted in my initial mail, I believe the transport _could_ be implemented, > with caveats, with the addition of some bookkeeping. AFAICT, the container > would still have to be involved in that every gadget would have to get a > directory of target gadgetIds and their domains/metadata. The reason I said > wpm (or IFPC) is necessary is that the other transport techniques require > initialization to send a message. wpm/IFPC technically do not -- just pass a > message to a purported receiver's domain (through relay file or directly in > wpm). > All this being said, I'm happy to accept a Shindig patch cleaning up the > docs. > --j > On Thu, Oct 29, 2009 at 5:32 AM, Ivan Žužak <[email protected]> wrote: >> >> John, thanks for clearing up the initialization stuff, makes perfect >> sense. >> >> What confuses me still is not the underlying implementation of G-2-G >> communication (direct or routed via container), but whether G-2-G >> communication is currently even implemented in Shindig in any way. In >> other words, do: >> >> "Remote procedure call library for .... gadget-to-gadget (thru >> container) communication." (from http://bit.ly/1mcjRT) and "Provides >> operations for making remote procedure calls for .... gadget-to-gadget >> communication." (from http://bit.ly/2gfe4C) >> >> mean: >> >> 1) "you _may_ call gadgets.rpc within a gadget and pass a targetId of >> another gadget, and the rpc framework _will_ automatically route the >> message (through the container) to the destination gadget" >> >> or: >> >> 2) "calling gadgets.rpc within a gadget and passing a targetId of >> another gadget _will not_ work, but you are free to implement it >> yourself on top the existing framework"? >> >> The descriptions of the library in rpc.js and OpenSocial Gadgets spec >> strongly imply that 1) is true, but looking at the code for rpc.js and >> wpm.transport.js leads me to 2). Namely, the gadgets.rpc.call method >> accepts a "targetId" parameter, and passes it to the specific >> transport call method (as it is). Therefore, the first line of the >> call method in wpm.transport.js: >> >> var targetWin = targetId === '..' ? window.parent : >> window.frames[targetId]; >> >> will _always_ fail if the method was called from within a gadget and >> targetId is the id of another gadget (since the destination is not the >> child of the source window, rather the sibling of the source). In >> order to have container-mediated communication, it seems that the >> gadgets.rpc.call method should check if the source and destination are >> both gadgets (not the container), and if so - set the targetId to the >> container id ("..") and then let the container tunnel the message. >> >> Basically, if G-2-G communication is implemented in any way - I don't >> understand how it can possibly work for wpm transport (I think >> initialization has little to do with this). If it is not implemented, >> the documentation is very misleading. >> >> Thanks again, >> Ivan >> >> On Wed, Oct 28, 2009 at 18:19, John Hjelmstad <[email protected]> wrote: >> > A few notes. >> > >> > First, pubsub *is* gadgets.rpc underneath. It uses container mediation >> > for >> > passing messages, and its implementation specifies additional semantics >> > for >> > when messages are brokered. >> > >> > Gadgets.rpc is just a dumb socket that makes C -> G communication and G >> > -> C >> > communication possible. Consider a loose analogue with "classic" pubsub >> > - >> > without the raw network connection, the additional semantics of pubsub >> > wouldn't be possible. >> > >> > To the topics here: initializing gadgets.rpc has historically been a >> > pain. >> > As Chris notes, you need to do gadgets.rpc.setRelayUrl() and >> > gadgets.rpc.setAuthToken() in your container. You also need to make sure >> > that the gadget is rendered with an rpctoken (as noted already; random >> > number/string on the fragment) and a parent= parameter pointing back to >> > at >> > least the protocol://host:port of the container page. >> > >> > On this note, I've recently submitted a simpler initialization routine: >> > gadgets.rpc.setupReceiver(gadgetId). This makes using the library: >> > 1. Include rpc.js in container page, as currently. Let container be >> > http://c.com/container >> > 2. Render gadget IFRAME with id <gadgetId> with parameters (can be >> > fragment >> > params) #parent=http://c.com/container&rpctoken=<random> >> > 3. Call gadgets.rpc.setupReceiver(<gadgetId>); >> > >> > The need to perform an active call to set up the rpc mechanism is rooted >> > in: >> > A) the fact that the underlying message-passing implementation differs >> > per >> > browser. Most of these impls (pretty much all except window.postMessage) >> > require an initialization routine with the container performing some >> > operation on the target IFRAME to allow it to send and receive messages. >> > @see each of the *.transport.js files for descriptions of these >> > techniques. >> > B) irrespective [A], having an initialization handshake makes it >> > possible to >> > mark C <-> G "connections" as active/inactive to avoid things like >> > continuously attempting to re-establish communication, which may be a >> > lost >> > cause (one side or the other doesn't support rpc or is misconfigured) >> > and >> > would just eat browser resources. >> > >> > The vagaries of the implementation, which are a direct consequence of >> > the >> > browser security model and per-browser quirks, mean that direct G <-> G >> > communication isn't possible, unless you build a custom implementation >> > that >> > either A) is slower (eg. uses IFPC with an active relay) or B) is less >> > secure/insecure (ie. all participating gadgets are rendered on the same >> > domain as one another, breaking isolation) or C) only works on HTML5 >> > browsers (window.postMessage). Again, the reason is that the "fast" >> > techniques on non-HTML5 browsers all require active initialization. For >> > instance, NIX (IE6/7) sets the .opener property on the target IFRAME for >> > instance, which requires DOM access to the IFRAME object - not possible >> > unless you break gadget sandboxing. >> > >> > As well, gadgets.rpc's implementation could be augmented to support >> > direct G >> > <-> G communication for the above listed cases (same-domain or >> > window.postMessage, namely) transparently, as a performance enhancement. >> > That hasn't been done yet and is tricky due to API issues (specifically, >> > container-mediated G <-> G hasn't been standardized, and it's bad form >> > IMO >> > to add a sometimes-works-not-always feature) and security concerns (it's >> > often quite nice to give the container power over whether to deliver G >> > <-> G >> > messages). >> > >> > In sum, this sounds like an initialization question. Once the library is >> > set >> > up properly, you can build whatever additional communication you like >> > atop >> > it eg. unicast. >> > >> > --j >> > >> > On Wed, Oct 28, 2009 at 2:18 AM, Ivan Žužak <[email protected]> wrote: >> > >> >> Hi John, >> >> >> >> Do you mind taking a look at this when you find the time? The first >> >> post is here: >> >> >> >> http://mail-archives.apache.org/mod_mbox/incubator-shindig-dev/200910.mbox/browser >> >> Thanks! >> >> >> >> Ivan >> >> >> >> On Sat, Oct 17, 2009 at 17:13, Ivan Žužak <[email protected]> wrote: >> >> > Hey Chris, >> >> > >> >> > The gadgets.rpc feature is a part of the official spec - >> >> > >> >> >> >> http://www.opensocial.org/Technical-Resources/opensocial-spec-v09/Gadgets-API-Specification.html#gadgets.rpc >> >> . >> >> > However, the publish-subscribe mechanism feature which OAA is also >> >> > working on isn't in the official OpenSocial spec. Thanks for the >> >> > pointer to the OpenSocial thread - I'm actually very interested in >> >> > where widgets and inter-widget communication are going and will keep >> >> > an eye on what Mark is doing. >> >> > >> >> > The project I'm working on (http://geppeto.fer.hr/) requires unicast >> >> > inter-widget communication for which, although it could be mimicked >> >> > with pub-sub, rpc would be a better fit. We've gotten around the >> >> > issue, but would now just like to find our if we were doing something >> >> > wrong or G2G rpc communication isn't supposed be working anyway. >> >> > >> >> > With hope that I won't be considered annoying, I've added John >> >> > Hjelmstad to the thread. As far as I can see by the SVN commits, John >> >> > implemented the gadgets.rpc feature and can hopefully shed some light >> >> > on this. John - you probably don't remember me, but we've met a few >> >> > times while I was interning at Google back in 2007. Adam Sah was my >> >> > mentor and together with another intern, Doug Coker and Adam I worked >> >> > on the initial implementation of the pub-sub feature for Google >> >> > Gadgets. >> >> > >> >> > Thanks, >> >> > Ivan >> >> > >> >> > On Sat, Oct 17, 2009 at 12:40, Chris Chabot <[email protected]> >> >> > wrote: >> >> >> From what I understand gadget-to-gadget communication is the goal of >> >> that >> >> >> feature, it is container mediated, partially I guess since on many >> >> >> containers each gadget has it's own unique domain as to block direct >> >> >> gadget-to-gadget interaction (which is a security risk), but that >> >> >> should >> >> >> 'work' without modifications. >> >> >> >> >> >> rpc isn't an official spec feature at the moment and hasn't seen a >> >> >> lot >> >> of >> >> >> love, however IBM and some others have taken an interest in >> >> >> cross-gadget-rpc'ing in OpenSocial and are working on a new proposal >> >> that's >> >> >> based on OpenAjax's RPC methodology, there's some details here: >> >> >> >> >> >> >> http://groups.google.com/group/opensocial-and-gadgets-spec/browse_thread/thread/951b8e86c3782b86/e7ce4e22e1ed9929?show_docid=e7ce4e22e1ed9929&pli=1 >> >> >> >> >> >> If you have a strong need for a better RPC mechanism, you could >> >> >> contact >> >> Mark >> >> >> and see how you could be involved, or if you're ok with waiting a >> >> >> bit, >> >> >> taking a wait and see approach to see what they'll produce :) >> >> >> >> >> >> On Sat, Oct 17, 2009 at 9:40 AM, Ivan Žužak <[email protected]> >> >> >> wrote: >> >> >> >> >> >>> Chris, you're right - I need those anyway so thanks for the partuza >> >> >>> example. :) >> >> >>> >> >> >>> I've actually gotten around the gadget-to-gadget issue by modifying >> >> >>> the rpc code a bit. I just wanted to find out why this isn't >> >> >>> supported >> >> >>> out-of-the-box - does it introduce any security issues or is this >> >> >>> not >> >> >>> though of as a useful use case? >> >> >>> >> >> >>> Thanks for the help, Chris! >> >> >>> Ivan >> >> >>> >> >> >>> On Fri, Oct 16, 2009 at 20:56, Chris Chabot <[email protected]> >> >> wrote: >> >> >>> > On Fri, Oct 16, 2009 at 4:41 PM, Ivan Žužak <[email protected]> >> >> wrote: >> >> >>> > >> >> >>> >> Hey Chris, >> >> >>> >> >> >> >>> >> 1) The container does load the rpc library. >> >> >>> >> 2) Each gadget on the container is loaded from a URL that does >> >> contain >> >> >>> >> a rpc token in the fragment part. >> >> >>> >> 3) I do not see the setRelayUrl and setAuthToken calls. Is this >> >> >>> >> something that should be automatically generated without my >> >> >>> >> intervention into shindig code or something that requires >> >> >>> >> changing >> >> >>> >> shindig? As I understand, these calls should be placed on the >> >> >>> >> container not in each gadget? >> >> >>> >> >> >> >>> > >> >> >>> > This is something you should add to your container code, ie in >> >> >>> > the >> >> part >> >> >>> that >> >> >>> > generates the gadget iframe's, as a practical example this is how >> >> they're >> >> >>> > generated in Partuza: >> >> >>> > >> >> >>> >> >> >> >> http://code.google.com/p/partuza/source/browse/trunk/Application/Views/gadget/gadget.php >> >> >>> > >> >> >>> > >> >> >>> > >> >> >>> > >> >> >>> >> In any case, does gadget-to-gadget communication go through the >> >> >>> >> container or directly between two iframes? If I interpret the >> >> >>> >> code >> >> >>> >> correctly, the setRelayUrl and setAuthToken calls enable >> >> communication >> >> >>> >> between container and gadget, not between two gadgets - when >> >> >>> >> gadgets.rpc.call is invoked within a gadget and an ID which is >> >> >>> >> not >> >> the >> >> >>> >> container is specified, the wpm transport fails when trying to >> >> obtain >> >> >>> >> the destination frame since window.frames[targetId] is undefined >> >> >>> >> (since the target is not a child of the gadget, rather it's >> >> sibling). >> >> >>> >> >> >> >>> > >> >> >>> > Correct, I thought the RPC calls were container mediated, but I >> >> haven't >> >> >>> > personally looked at that code for a while so I'm hoping that by >> >> adding >> >> >>> > those 2 calls things might magically start to work, and if not >> >> >>> > you >> >> needed >> >> >>> > those anyhow:) >> >> >>> > >> >> >>> >> >> >> >> >> > >> >> >> > > >

