¿Bloquea el método JavaScript WebSocket.send?

Si estoy enviando un Blob grande o ArrayBuffer través de un WebSocket JavaScript a través de su método de send … ¿ send bloque de llamadas al método hasta que se envían los datos o hace una copy de los datos para enviarlos de manera asincrónica para que la llamada pueda regresar? ¿inmediatamente?

Una pregunta relacionada (sin respuesta) es, a partir de cómo la interpreto, si una serie rápida de envíos provocará que los events de posts se retrasen, como parece haber ocurrido en Mobile Safari: comportamiento aparente de locking en JavaScript websocket en Safari mobile

Basándonos en la descripción del atributo buffenetworkingAmount , dedujimos que el send debe retornar de inmediato, ya que de lo contrario el valor de buffenetworkingAmount siempre será cero. Si no es cero, entonces debe haber datos almacenados en búfer de una llamada anterior para enviar, y si envía datos de búferes, no hay razón para que se bloqueen.

De http://dev.w3.org/html5/websockets/

El atributo buffenetworkingAmount debe devolver el número de bytes de datos de la aplicación (text UTF-8 y datos binarys) que se han puesto en queue utilizando send () pero que, a partir de la última vez que el bucle de evento comenzó a ejecutar una tarea, aún no se había transmitido a la networking (Esto incluye cualquier text enviado durante la ejecución de la tarea actual, independientemente de si el agente de usuario puede transmitir text de forma asíncrona con la ejecución de scripts). Esto no incluye la sobrecarga de encuadre incurrida por el protocolo o el almacenamiento en búfer realizado por el sistema operativo o hardware de networking. Si la connection está cerrada, el valor de este atributo solo boostá con cada llamada al método send () (el número no se restablece a cero una vez que se cierra la connection).

En este ejemplo simple, el atributo buffenetworkingAmount se usa para garantizar que las actualizaciones se envíen a razón de una actualización cada 50 ms, si la networking puede manejar esa tasa, o a cualquier velocidad que la networking pueda manejar, si eso es demasiado rápido.

 var socket = new WebSocket('ws://game.example.com:12010/updates'); socket.onopen = function () { setInterval(function() { if (socket.buffenetworkingAmount == 0) socket.send(getUpdateData()); }, 50); }; 

El atributo buffenetworkingAmount también se puede usar para saturar la networking sin enviar los datos a una velocidad mayor que la que puede manejar la networking, aunque esto requiere una supervisión más cuidadosa del valor del atributo a lo largo del time.