- From: David Rajchenbach-Teller <dteller@mozilla.com>
- Date: Mon, 14 Oct 2013 11:33:14 +0200
- CC: public-webapps <public-webapps@w3.org>
Let me introduce the first sketch of a variant. The general idea is to
add a |postSyncMessage|
We extend DedicatedWorkerGlobalScope and MessageEvent as follows:
interface DedicatedWorkerGlobalScope : WorkerGlobalScope {
void postMessage(any message, optional sequence<Transferable> transfer);
any postSyncMessage(any message, optional sequence<Transferable>
transfer);
};
interface SyncMessageEvent : MessageEvent {
void reply(optional any message, optional sequence<Transferable>
transfer);
};
The behavior of |postSyncMessage| is the following:
1. the sender worker sleeps and does not handle any |postMessage|
messages until it is awakened;
2. instead of the usual |MessageEvent|, the target's |onmessage|
receives as argument a |SyncMessageEvent| (call it |s|);
3. if |s.reply(x)| is called, the sender's |postSyncMessage| method
returns a copy of |x|, obtained with the usual algorithm;
5. if |s.reply()| has not called by the time the worker is either
garbage-collected or |terminate()| is called on its |MessagePort|, the
worker is killed as usual.
I have not attempted to detail the inner workings of the underlying
MessagePort, but I suspect that this is close to Jonas Sicking's proposal.
Cheers,
David
Received on Monday, 14 October 2013 09:33:40 UTC