Workers ♥ ArrayBuffer

Desde crbug.com/73313 (link em inglês), o Chrome 13 e o FF5 oferecem suporte ao envio de uma ArrayBuffer (ou matriz tipada) de/para um worker da Web. Exemplo:

worker.js

self.onmessage = function(e) {
    var uInt8Array = e.data;
    postMessage("Inside worker.js: uInt8Array.toString() = " + uInt8Array.toString());
    postMessage("Inside worker.js: uInt8Array.byteLength = " + uInt8Array.byteLength);
};

main.html

var uInt8Array = new Uint8Array(new ArrayBuffer(10));
for (var i = 0; i < uInt8Array.length; ++i) {
    uInt8Array[i] = i * 2; // [0, 2, 4, 6, 8,...]
}

console.log('uInt8Array.toString() = ' + uInt8Array.toString());
console.log('uInt8Array.byteLength = ' + uInt8Array.byteLength);

worker.postMessage(uInt8Array);

Por que isso é emocionante?...dados binários!

Em vez de o navegador serializar seus dados postMessage() para um objeto JSON, ele usa o algoritmo de clone estruturado para copiar o ArrayBuffer para o contexto do worker e vice-versa. Isso abre um potencial real para os profissionais que não conhecemos antes. Ou seja, a capacidade de transmitir com facilidade dados binários entre o app principal e a linha de execução do worker.

A E/S de matriz tipada torna a manipulação intensa de imagem, o processamento de som e os cálculos pesados de WebGL muito mais viáveis. Por exemplo, é possível ler um arquivo como um buffer de matriz ou buscar um Blob usando XHR2 e transmitir o resultado diretamente para um worker. Chega de codificar os dados em base64 :)

Na minha opinião, esse é um dos detalhes que os trabalhadores precisam ter incluído desde o início. Faz sentido.