[whatwg] Workers proposal

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?

-- 
Ian Hickson               U+1047E                )\._.,--....,'``.    fL
http://ln.hixie.ch/       U+263A                /,   _.. \   _\  ;`._ ,.
Things that are impossible just take longer.   `._.-(,_..'--(,_..'`-.;.'

Received on Wednesday, 20 August 2008 17:36:28 UTC