Based on the description of the bufferedAmount
attribute, I have deduced that send
must return immediately, because otherwise bufferedAmount
would always be zero. If it is non-zero, then there must be data buffered from a prior call to send, and if send buffers data, there's no reason for it to block.
From http://dev.w3.org/html5/websockets/
The bufferedAmount attribute must return the number of bytes of
application data (UTF-8 text and binary data) that have been queued
using send() but that, as of the last time the event loop started
executing a task, had not yet been transmitted to the network. (This
thus includes any text sent during the execution of the current task,
regardless of whether the user agent is able to transmit text
asynchronously with script execution.) This does not include framing
overhead incurred by the protocol, or buffering done by the operating
system or network hardware. If the connection is closed, this
attribute's value will only increase with each call to the send()
method (the number does not reset to zero once the connection closes).
In this simple example, the bufferedAmount attribute is used to ensure
that updates are sent either at the rate of one update every 50ms, if
the network can handle that rate, or at whatever rate the network can
handle, if that is too fast.
var socket = new WebSocket('ws://game.example.com:12010/updates');
socket.onopen = function () {
setInterval(function() {
if (socket.bufferedAmount == 0)
socket.send(getUpdateData());
}, 50);
};
The bufferedAmount attribute can also be used to saturate the network
without sending the data at a higher rate than the network can handle,
though this requires more careful monitoring of the value of the attribute over time.