[whatwg] Combining the DedicatedWorker and SharedWorker interfaces

Jonas Sicking jonas at sicking.cc
Tue Nov 4 14:45:20 PST 2008


Jonas Sicking wrote:
>> Here's an example in code:
>>
>> // dedicated workers (outside)
>> var worker = new Worker("foo.js");
>> var port = worker.connect();
>> port.onmessage = function() { }
>> port.postMessage("ping");
>>
>> // dedicated workers (inside)
>> onconnect = function(e) {
>>   e.port.onmessage = function(e) {
>>     e.port.postMessage("pong");
>>   }
>> }
>>
>> Shared workers are exactly the same except the constructor is
>> SharedWorker("foo.js", "foo");
>>
>> Note that I do not think it is necessary to implement this all at
>> once. For one, the SharedWorker constructor could easily be punted for
>> future releases.
>>
>> Thoughts?
> 
> My main concern is that I think this makes the most simple use case a 
> bit too complicated. In the case when you have a dedicated worker that 
> you want to offload some calculations too you need quite a bit of code 
> to set up that communication.
> 
> With the current API you'd do the following:
> 
> main.js:
> w = new Worker('worker.js');
> w.postMessage(17);
> w.onmessage = function(e) {
>   answer = e.data;
> }
> 
> worker.js:
> function heavyCalulation(inValue) {
>   ...
> }
> onmessage = function(e) {
>   postMessage(heavyCalculation(e.data));
> }
> 
> 
> With the proposed API:
> 
> main.js:
> w = new Worker('worker.js');
> p = w.connect();
> p.postMessage(17);
> p.onmessage = function(e) {
>   answer = e.data;
> }
> 
> worker.js:
> function heavyCalulation(inValue) {
>   ...
> }
> onconnect = function(e) {
>   e.port.onmessage = function(e2) {
>     e.port.postMessage(heavyCalulation(e2.data));
>   }
> }
> 
> 
> This complexity I feel is extra bad since I suspect the simple case is 
> going to be the common case (I know we disagree there). I especially 
> dislike the fact that you have to wait for two events, first a 'connect' 
> event and then the actual message event. This seems overly complex for 
> the simple case of simply wanting to use a single communication channel 
> with a dedicated worker. And even though there isn't that much more code 
> in my example above, it took significantly more effort to get it right 
> given the nested two handlers that were needed.
> 
> So I think we should keep the simple case of a dedicated worker and a 
> single communication channel as simple as possible. This means that I 
> think we should keep postMessage/onmessage available on the dedicated 
> worker directly, as well as the dedicated worker global scope.
> 
> As an added bonus this keeps things very similar to message passing 
> between windows.
> 
> 
> I'm fine with removing things like 'startConversation' and the implicit 
> call to connect() on shared workers. 'startConversation' isn't really a 
> new communication mechanism, but rather a convenience method on top of 
> postMessage.

So Hixie brought up a good point on IRC, there really is only one 
communication mechanism, which is postMessage/onmessage.

I'd note that if we drop startConversation (which it seems like no-one 
is opposing) then all proposals have two 'communication' mechanisms: 
postMessage and connect.

With Aarons proposal you have to both for a shared worker and a 
dedicated worker use both mechanisms; first call connect() and then call 
postMessage(). If keep postMessage on the dedicated worker the only 
difference is that for a dedicated worker you skip the connect() and go 
directly to postMessage.

/ Jonas



More information about the whatwg mailing list