Rolf B: Passing a Blob

Beitrag lesen

Hallo Michael_K,

typedArray? D.h. einer der Abkömmlinge von TypedArray? Ist ja prima - diese Dinger basieren auf einem ArrayBuffer, der Transferable ist. Bau keinen Blob, nimm einfach das buffer-Property aus dem TypedArray und schick den Buffer zum iframe.

Mit dem ArrayBuffer wird ebenfalls kein angepappted Property kopiert. Macht aber nichts, ich finde das von mir vorgeschlagene Wrapper-Objekt dafür deutlich eleganter. Vorteil vom ArrayBuffer ist, dass er transferiert werden kann, d.h. keine Kopie erstellt werden muss. Bei kleinen Arrays ist das egal, bei Klöpsen von mehreren Megabyte ist die Sache interessanter.

Beispielhaft so:

function sendToIFrame(iframe, name, typedArray) {
   const message = {
      name: name,
      buffer: typedArray.buffer,
      ctorName: typedArray.constructor.name 
   };
   iframe.postMessage(message, *", [ message.buffer ]);
}

Im iframe kannst Du dann über ctorName den Konstruktor wiedergewinnen und das TypedArray neu erzeugen. Da ein TypedArray nichts weiter ist als ein View auf den ArrayBuffer, geht das schnell und ohne Kopieren.

window.addEventListener("message", function(msgEvent) {
   const message = msgEvent.data,
         constructor = window[message.ctorName],
         array = new constructor(message.buffer);
});

Und dann kannst Du Dir überlegen, ob Du den Namen direkt aus message.name verwenden willst oder ob Du ihn an das typed array in der Variablen array anpappst.

Natürlich könnte man jetzt noch einen Schritt zurückgehen. Wo kommt das TypedArray her? Was steckst Du da rein? Kann man ggf. auch auf das TypedArray verzichten und direkt mit der Quelle dafür arbeiten?

Rolf

--
sumpsi - posui - obstruxi