In the last chapter, you learned about the guts of asynchronous programming, as we went deep into Scala’s ExecutionContext and Future patterns. In this chapter, we’ll investigate streams, another aspect of asynchronous programs, as we adapt libuv’s facilities for terminal and file I/O to our rapidly growing framework.