- From: Ian Hickson <ian@hixie.ch>
- Date: Tue, 21 Jun 2011 18:07:52 +0000 (UTC)
- To: Jonas Sicking <jonas@sicking.cc>
- cc: Andrew Wilson <atwilson@google.com>, Kenneth Russell <kbr@google.com>, David Levin <levin@chromium.org>, Arthur Barstow <art.barstow@nokia.com>, Glenn Maynard <glenn@zewt.org>, Dmitry Lomov <dslomov@google.com>, ben turner <bent.mozilla@gmail.com>, "public-webapps@w3.org" <public-webapps@w3.org>, Travis Leithead <Travis.Leithead@microsoft.com>
On Tue, 21 Jun 2011, Jonas Sicking wrote:
> On Tue, Jun 21, 2011 at 12:39 AM, Ian Hickson <ian@hixie.ch> wrote:
> > On Mon, 20 Jun 2011, Jonas Sicking wrote:
> >>
> >> If data appears both in the .ports array and the .data property, then
> >> people will be tempted to create protocols which only work if the
> >> array buffer is transferred, i.e. if the receiver only looks in
> >> .ports. I.e. people will likely end up with equally ugly solutions
> >> like:
> >>
> >> postMessage('vend-reply', [createClone(arraybuffer)]);
> >
> > Yeah, that's a very good point.
> >
> > It really seems like part of the problem here is that ports and
> > arrayBuffers are quite different (in that one will always want to be
> > transferred, but for the other you might want to sometimes transfer
> > and sometimes not).
>
> I don't think we should worry too much about suboptimal syntax when
> transferring ports. We can always add more syntax sugar later if people
> think it's annoying. Better keep the initial version simple than to try
> to guess which use cases will be the most common ones.
Keeping it simple is one of the reasons I don't want to require that
authors list every port twice in order to send a port. (Sending a port is
intended to be a common pattern, at least if the API is used as intended.)
So the current situation is as follows:
- we want to be able to send structured data that is cloned.
- we want the structured data to be able to contain arraybuffers and ports.
- we want it to be possible for the author to opt-in to transferring
specific arraybuffers rather than just cloning them.
- we want the author to have to explicitly list the ports that are to be
transferred because it would be easy to accidentally transfer one
otherwise, and that would cause hard-to-find bugs (e.g. if the data
being cloned happened to contain debugging information that happened to
contain a reference to a port).
- we don't want to require that authors list ports twice in the simple
case, since that's quite ugly
- we don't want authors to design APIs where arraybuffers can only be
transferred and not copied; the receiving side should not be able to
influence the sending side's decision as to whether to clone or
transfer arraybuffers.
How about we just make postMessage() take the object to clone in the first
argument, an array of objects to transfer in the second; on the other
side, the author receives the object cloned, with anything listed in the
array and in the structured data being transferred instead of cloned, and,
in addition, in the event.ports array, a list of the ports that were given
in the transfer array.
This has the advantage of being completely backwards-compatible.
So for example, on the sending side:
postMessage(['copied', copiedArrayBuffer, transferredArrayBuffer,
transferredPort1], // could be an object too
[transferredArrayBuffer, transferredPort1,
transferredPort2]);
...on the receiving side, the event has
data == ['copied', newCopiedArrayBuffer, newTransferredArrayBuffer,
newTransferredPort1];
ports == [newTransferredPort1, newTransferredPort2];
It's not going to win any design awards, but I think that boat has sailed
for this particular API anyway, given the contraints we're operating under.
--
Ian Hickson U+1047E )\._.,--....,'``. fL
http://ln.hixie.ch/ U+263A /, _.. \ _\ ;`._ ,.
Things that are impossible just take longer. `._.-(,_..'--(,_..'`-.;.'
Received on Tuesday, 21 June 2011 18:08:16 UTC