void _unmask()

in lib/src/copy/web_socket_impl.dart [231:265]


  void _unmask(int index, int length, Uint8List buffer) {
    const BLOCK_SIZE = 16;
    // Skip Int32x4-version if message is small.
    if (length >= BLOCK_SIZE) {
      // Start by aligning to 16 bytes.
      final startOffset = BLOCK_SIZE - (index & 15);
      final end = index + startOffset;
      for (var i = index; i < end; i++) {
        buffer[i] ^= _maskingBytes[_unmaskingIndex++ & 3];
      }
      index += startOffset;
      length -= startOffset;
      final blockCount = length ~/ BLOCK_SIZE;
      if (blockCount > 0) {
        // Create mask block.
        var mask = 0;
        for (var i = 3; i >= 0; i--) {
          mask = (mask << 8) | _maskingBytes[(_unmaskingIndex + i) & 3];
        }
        final blockMask = Int32x4(mask, mask, mask, mask);
        final blockBuffer = Int32x4List.view(buffer.buffer, index, blockCount);
        for (var i = 0; i < blockBuffer.length; i++) {
          blockBuffer[i] ^= blockMask;
        }
        final bytes = blockCount * BLOCK_SIZE;
        index += bytes;
        length -= bytes;
      }
    }
    // Handle end.
    final end = index + length;
    for (var i = index; i < end; i++) {
      buffer[i] ^= _maskingBytes[_unmaskingIndex++ & 3];
    }
  }