[whatwg] Workers proposal
Jonas Sicking
jonas at sicking.cc
Wed Aug 20 22:32:18 PDT 2008
This is looking great. A few comments though (of course :) )
Do we really need the SharedWorker interface. I.e. couldn't we just
return a MessagePort? This would probably require that we use a factory
function rather than a constructor, like "getPortForSharedWorker" or
some such. In other words, do we really need onclose and onerror for
shared workers (onerror seems to make some sense, onclose i'm less sure
about).
I think startConversation makes as much sense on shared workers as
dedicated ones, so moving that API up to Worker/WorkerGlobalScope seems
like a good idea.
If we keep the constructors (see first paragraph), I would prefer the
syntax "new Worker" over "new DedicatedWorker".
/ Jonas
Ian Hickson wrote:
> I've received feedback from a number of people requesting a rethink to the
> API for creating and communicating with workers.
>
> Here is a skeleton of a new proposal. It makes the following changes:
>
> * Shared workers and dedicated workers get their own interfaces,
> inheriting from a common base interface, both for the global scope
> objects and for the objects returned when they are created.
>
> * Shared workers get a port per connection. Dedicated workers don't get a
> port, but they have a convenience method on the worker and on the
> worker's global object that allows for easy creation of ports to send
> threaded messages (direct replies).
>
> * Uses constructors instead of factory methods to create workers.
>
> * Removes 'onload' from the Worker objects.
>
> * Renamed "onunload" to "onclose" throughout.
>
> * Removes the "closing" boolean.
>
> * Adds a way to kill a dedicated worker.
>
>
> OUTSIDE
>
> // (abstract, never instantiated)
> [NoInterfaceObject] interface Worker {
> attribute EventListener onerror; // invoked if the worker fails to start
> attribute EventListener onclose; // invoked if the worker closes
> };
>
> interface DedicatedWorker : Worker {
> void close(); // kills the worker immediately, without cleanup
>
> // these all work the same as on MessagePorts:
> attribute EventListener onmessage; // receives messages from the worker
> boolean postMessage(in DOMString message);
> boolean postMessage(in DOMString message, in MessagePort, port);
> MessagePort startConversation(in DOMString message);
> };
>
> interface SharedWorker : Worker {
> readonly attribute MessagePort port; // local end of channel to worker
> };
>
>
> INSIDE
>
> // (abstract, never instantiated)
> [NoInterfaceObject] interface WorkerGlobalScope {
> void close();
> attribute EventListener onclose;
>
> readonly attribute WorkerGlobalScope self;
> readonly attribute WorkerLocation location;
> // also implements everything on WorkerUtils
> };
>
> [NoInterfaceObject] interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
> // these all work the same as on MessagePorts:
> attribute EventListener onmessage; // receives messages from the owner
> boolean postMessage(in DOMString message);
> boolean postMessage(in DOMString message, in MessagePort, port);
> MessagePort startConversation(in DOMString message);
> };
>
> [NoInterfaceObject] interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
> attribute EventListener onconnect; // called by createSharedWorker()
> readonly attribute DOMString name;
> };
>
>
> CREATING WORKERS
>
> To created workes, use constructors:
>
> var worker = new DedicatedWorker(url);
> var service = new SharedWorker(name, url);
>
>
> Comments?
>
More information about the whatwg
mailing list