| 140 | } |
| 141 | |
| 142 | func (w *Writer) trySendDataLocked() bool { |
| 143 | availWindow := w.readWindow - w.sentNotAcked |
| 144 | if availWindow <= 0 { |
| 145 | return false |
| 146 | } |
| 147 | |
| 148 | toSend := len(w.buffer) |
| 149 | if int64(toSend) > availWindow { |
| 150 | toSend = int(availWindow) |
| 151 | } |
| 152 | |
| 153 | data := w.buffer[:toSend] |
| 154 | w.buffer = w.buffer[toSend:] |
| 155 | |
| 156 | dataStr := base64.StdEncoding.EncodeToString(data) |
| 157 | dataPk := wshrpc.CommandStreamData{ |
| 158 | Id: w.id, |
| 159 | Seq: w.nextSeq, |
| 160 | Data64: dataStr, |
| 161 | } |
| 162 | |
| 163 | w.dataSender.SendData(dataPk) |
| 164 | w.nextSeq += int64(toSend) |
| 165 | w.sentNotAcked += int64(toSend) |
| 166 | |
| 167 | return toSend > 0 |
| 168 | } |
| 169 | |
| 170 | // If Close() is called while a Write is blocked, the Write will return an error and buffered data may be discarded. |
| 171 | func (w *Writer) Close() error { |