Workers ♥ ArrayBuffer

A partir de crbug.com/73313, o Chrome 13 e o FF5 oferecem suporte ao envio de uma ArrayBuffer (ou Typed Array) para/de um Web Worker. 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 é interessante?...dados binários!

Em vez de serializar os dados postMessage() em um objeto JSON, o navegador usa o algoritmo de clonagem estruturada para copiar o ArrayBuffer para o contexto do worker e vice-versa. Isso abre um potencial real para os workers que ainda não vimos. Ou seja, transmitir dados binários com facilidade entre o app principal e a linha de execução do worker.

A E/S de matrizes tipadas torna a manipulação de imagens intensa, o processamento de som e os cálculos pesados do 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, essa é uma daquelas coisas que os trabalhadores deveriam ter incluído desde o início. Isso faz sentido.