* Receive data * @this {!Receiver} * @param {!Uint8Array|!ReadBuffer|!WriteBuffer} buffer Buffer * @param {number=} offset Buffer offset, defaulfs is 0 * @param {number=} size Buffer size, defaulfs is undefined
(buffer, offset = 0, size = undefined)
| 5734 | * @param {number=} size Buffer size, defaulfs is undefined |
| 5735 | */ |
| 5736 | receive (buffer, offset = 0, size = undefined) { |
| 5737 | if (size == null) { |
| 5738 | size = buffer.length |
| 5739 | } |
| 5740 | |
| 5741 | console.assert(((offset + size) <= buffer.length), 'Invalid offset & size!') |
| 5742 | if ((offset + size) > buffer.length) { |
| 5743 | throw new Error('Invalid offset & size!') |
| 5744 | } |
| 5745 | |
| 5746 | if (size === 0) { |
| 5747 | return |
| 5748 | } |
| 5749 | |
| 5750 | if ((buffer instanceof ReadBuffer) || (buffer instanceof WriteBuffer)) { |
| 5751 | buffer = buffer.buffer |
| 5752 | } |
| 5753 | |
| 5754 | // Storage buffer |
| 5755 | let offset0 = this._receiveBuffer.offset |
| 5756 | let offset1 = this._receiveBuffer.size |
| 5757 | let size1 = this._receiveBuffer.size |
| 5758 | |
| 5759 | // Receive buffer |
| 5760 | let offset2 = 0 |
| 5761 | let size2 = size |
| 5762 | |
| 5763 | // While receive buffer is available to handle... |
| 5764 | while (offset2 < size2) { |
| 5765 | let messageBuffer = null |
| 5766 | let messageOffset = 0 |
| 5767 | let messageSize = 0 |
| 5768 | |
| 5769 | // Try to receive message size |
| 5770 | let messageSizeCopied = false |
| 5771 | let messageSizeFound = false |
| 5772 | while (!messageSizeFound) { |
| 5773 | // Look into the storage buffer |
| 5774 | if (offset0 < size1) { |
| 5775 | let count = Math.min(size1 - offset0, 4) |
| 5776 | if (count === 4) { |
| 5777 | messageSizeCopied = true |
| 5778 | messageSizeFound = true |
| 5779 | messageSize = Receiver.readUInt32(this._receiveBuffer.buffer, this._receiveBuffer.offset + offset0) |
| 5780 | offset0 += 4 |
| 5781 | break |
| 5782 | } else { |
| 5783 | // Fill remaining data from the receive buffer |
| 5784 | if (offset2 < size2) { |
| 5785 | count = Math.min(size2 - offset2, 4 - count) |
| 5786 | |
| 5787 | // Allocate and refresh the storage buffer |
| 5788 | this._receiveBuffer.allocate(count) |
| 5789 | size1 += count |
| 5790 | |
| 5791 | for (let i = 0; i < count; i++) { |
| 5792 | this._receiveBuffer.buffer[offset1 + i] = buffer[offset + offset2 + i] |
| 5793 | } |
no test coverage detected