no longer inherits Duplex and accepts an optional duplex argument