- From: Ian Hickson via cvs-syncmail <cvsmail@w3.org>
- Date: Thu, 14 Aug 2008 23:33:20 +0000
- To: public-html-commits@w3.org
Update of /sources/public/html5/workers
In directory hutz:/tmp/cvs-serv18347
Modified Files:
Overview.html
Log Message:
Another example with delegation. (whatwg r56)
Index: Overview.html
===================================================================
RCS file: /sources/public/html5/workers/Overview.html,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -d -r1.48 -r1.49
--- Overview.html 10 Aug 2008 22:46:40 -0000 1.48
+++ Overview.html 14 Aug 2008 23:33:18 -0000 1.49
@@ -19,7 +19,7 @@
specification for HTML5</h2>
<h2 class="no-num no-toc" id=editors><!-- "W3C Working Draft" --> Editor's
- Draft <!--ZZZ-->10 August 2008</h2>
+ Draft <!--ZZZ-->14 August 2008</h2>
<dl><!-- ZZZ: update the month/day
<dt>This Version:</dt>
@@ -144,7 +144,7 @@
<p>The W3C <a href="http://www.w3.org/html/wg/">HTML Working Group</a> is
the W3C working group responsible for this specification's progress along
- the W3C Recommendation track. <!--ZZZ:--> This specification is the 10
+ the W3C Recommendation track. <!--ZZZ:--> This specification is the 14
August 2008 <!--ZZZ "Working Draft"-->Editor's Draft. <!--:ZZZ--></p>
<!-- UNDER NO CIRCUMSTANCES IS THE PRECEDING PARAGRAPH TO BE REMOVED OR EDITED WITHOUT TALKING TO IAN FIRST -->
<!-- relationship to other work (required) -->
@@ -198,7 +198,10 @@
<li><a href="#delegation"><span class=secno>1.1.5
</span>Delegation</a>
- <li><a href="#granting"><span class=secno>1.1.6 </span>Granting
+ <li><a href="#providing"><span class=secno>1.1.6 </span>Providing
+ libraries</a>
+
+ <li><a href="#granting"><span class=secno>1.1.7 </span>Granting
capabilities</a>
</ul>
@@ -866,7 +869,233 @@
<p><a href="http://www.whatwg.org/demos/workers/multicore/page.html">View
this example online</a>.
- <h4 id=granting><span class=secno>1.1.6 </span>Granting capabilities</h4>
+ <h4 id=providing><span class=secno>1.1.6 </span>Providing libraries</h4>
+
+ <p><em>This section is non-normative.</em>
+
+ <p>Suppose that a cryptography library is made available that provides
+ three tasks:
+
+ <dl>
+ <dt>Generate a public/private key pair
+
+ <dd>Takes a port, on which it will send two messages, first the public key
+ and then the private key.
+
+ <dt>Given a plaintext and a public key, return the corresponding
+ cyphertext
+
+ <dd>Takes a port, to which any number of messages can be sent, the first
+ giving the public key, and the remainder giving the plaintext, each of
+ which is encrypted and then sent on that same channel as the cyphertext.
+ The user can close the port when it is done encrypting content.
+
+ <dt>Given a cyphertext and a private key, return the corresponding
+ plaintext
+
+ <dd>Takes a port, to which any number of messages can be sent, the first
+ giving the private key, and the remainder giving the cyphertext, each of
+ which is decrypted and then sent on that same channel as the plaintext.
+ The user can close the port when it is done decrypting content.
+ </dl>
+
+ <p>The library itself is as follows:
+
+ <pre>function handleMessage(e) {
+ if (e.message == "genkeys")
+ genkeys(e.port);
+ else if (e.message == "encrypt")
+ encrypt(e.port);
+ else if (e.message == "decrypt")
+ decrypt(e.port);
+}
+
+function genkeys(p) {
+ var keys = _generateKeyPair();
+ p.postMessage(keys[0]);
+ p.postMessage(keys[1]);
+}
+
+function encrypt(p) {
+ var key, state = 0;
+ p.onmessage = function (e) {
+ if (state == 0) {
+ key = e.message;
+ state = 1;
+ } else {
+ p.postMessage(_encrypt(key, e.message));
+ }
+ };
+}
+
+function decrypt(p) {
+ var key, state = 0;
+ p.onmessage = function (e) {
+ if (state == 0) {
+ key = e.message;
+ state = 1;
+ } else {
+ p.postMessage(_decrypt(key, e.message));
+ }
+ };
+}
+
+onconnect = function (e) { e.port.onmessage = handleMessage; }
+
+
+// the "crypto" functions:
+
+function _generateKeyPair() {
+ return [Math.random(), Math.random()];
+}
+
+function _encrypt(k, s) {
+ return 'encrypted-' + k + ' ' + s;
+}
+
+function _decrypt(k, s) {
+ return s.substr(s.indexOf(' ')+1);
+}</pre>
+
+ <p>Note that the crypto functions here are just stubs and don't do real
+ cryptography.
+
+ <p>This library could be used as follows:
+
+ <pre><!DOCTYPE HTML>
+<html>
+ <head>
+ <title>Worker example: Crypto library</title>
+ <script>
+ var crytoLib = createWorker('libcrypto-v1.js'); // or could use 'libcrypto-v2.js'
+ function getKeys() {
+ var state = 0;
+ cryptoLib.port.startConversation("genkeys").onmessage = function (e) {
+ if (state == 0)
+ document.getElementById('public').value = e.message;
+ else if (state == 1)
+ document.getElementById('private').value = e.message;
+ state += 1;
+ };
+ }
+ function enc() {
+ var channel = new MessageChannel();
+ cryptoLib.port.postMessage("encrypt", channel.port2);
+ channel.port1.postMessage(document.getElementById('public').value);
+ channel.port1.postMessage(document.getElementById('input').value);
+ port1.onmessage = function (e) {
+ document.getElementById('input').value = e.message;
+ port1.close();
+ };
+ }
+ function dec() {
+ var channel = new MessageChannel();
+ cryptoLib.port.postMessage("decrypt", channel.port2);
+ channel.port1.postMessage(document.getElementById('private').value);
+ channel.port1.postMessage(document.getElementById('input').value);
+ port1.onmessage = function (e) {
+ document.getElementById('input').value = e.message;
+ port1.close();
+ };
+ }
+ </script>
+ <style>
+ textarea { display: block; }
+ </style>
+ </head>
+ <body onload="getKeys()">
+ <fieldset>
+ <legend>Keys</legend>
+ <p><label>Public Key: <textarea id="public"></label></p>
+ <p><label>Private Key: <textarea id="private"></label></p>
+ </fieldset>
+ <p><label>Input: <textarea id="input"></label></p>
+ <p><button onclick="enc()">Encrypt</button> <button onclick="dec()">Decrypt</button></p>
+ </body>
+</html></pre>
+
+ <p>A later version of the API, though, might want to offload all the crypto
+ work onto subworkers. This could be done as follows:
+
+ <pre>function handleMessage(e) {
+ if (e.message == "genkeys")
+ genkeys(e.port);
+ else if (e.message == "encrypt")
+ encrypt(e.port);
+ else if (e.message == "decrypt")
+ decrypt(e.port);
+}
+
+function genkeys(p) {
+ var generator = createWorker('libcrypto-v2-generator.js');
+ generator.postMessage('', p);
+}
+
+function encrypt(p) {
+ p.onmessage = function (e) {
+ var key = e.message;
+ var encryptor = createWorker('libcrypto-v2-encryptor.js');
+ encryptor.postMessage(key, p);
+ };
+}
+
+function encrypt(p) {
+ p.onmessage = function (e) {
+ var key = e.message;
+ var decryptor = createWorker('libcrypto-v2-decryptor.js');
+ decryptor.postMessage(key, p);
+ };
+}
+
+onconnect = function (e) { e.port.onmessage = handleMessage; }
+</pre>
+
+ <p>The little subworkers would then be as follows.
+
+ <p>For generating key pairs:
+
+ <pre>port.onmessage = function (e) {
+ e.port.postMessage(Math.random());
+ e.port.postMessage(Math.random());
+ close();
+}
+</pre>
+
+ <p>For encrypting:
+
+ <pre>port.onmessage = function (e) {
+ var key = e.message;
+ e.port.onmessage = function (e) {
+ var s = e.message;
+ port.postMessage('encrypted-' + key + ' ' + s);
+ }
+ e.port.onunload = function (e) {
+ close();
+ }
+}</pre>
+
+ <p>For decrypting:
+
+ <pre>port.onmessage = function (e) {
+ var key = e.message;
+ e.port.onmessage = function (e) {
+ var s = e.message;
+ port.postMessage(s.substr(s.indexOf(' ')+1));
+ }
+ e.port.onunload = function (e) {
+ close();
+ }
+}</pre>
+
+ <p>Notice how the users of the API don't have to even know that this is
+ happening — the API hasn't changed; the library can delegate to
+ subworkers without changing its API, even though it is accepting data
+ using message channels.
+
+ <p><a href="http://www.whatwg.org/demos/workers/crypto/page.html">View this
+ example online</a>.
+
+ <h4 id=granting><span class=secno>1.1.7 </span>Granting capabilities</h4>
<p><em>This section is non-normative.</em>
Received on Thursday, 14 August 2008 23:33:57 UTC