private function write(Rfc6455Client $client, $frameInfo) : Promise
{
if ($client->closedAt) {
return new Failure(new ClientException());
}
$msg = $frameInfo["msg"];
$len = \strlen($msg);
$w = chr($frameInfo["fin"] << 7 | $frameInfo["rsv"] << 4 | $frameInfo["opcode"]);
if ($len > 0xffff) {
$w .= "" . pack('J', $len);
} elseif ($len > 0x7d) {
$w .= "~" . pack('n', $len);
} else {
$w .= chr($len);
}
$w .= $msg;
if ($client->writeBuffer != "") {
if (\strlen($client->writeBuffer) < 65536 && !$client->writeDataQueue && !$client->writeControlQueue) {
$client->writeBuffer .= $w;
$deferred = $client->writeDeferred;
} elseif ($frameInfo["opcode"] >= 0x8) {
$client->writeControlQueue[] = $w;
$deferred = $client->writeDeferredControlQueue[] = new Deferred();
} else {
$client->writeDataQueue[] = $w;
$deferred = $client->writeDeferredDataQueue[] = new Deferred();
}
} else {
\Amp\enable($client->writeWatcher);
$client->writeBuffer = $w;
$deferred = $client->writeDeferred = new Deferred();
}
return $deferred->promise();
}