-- | -- Module : Streamly.Network.Server -- Copyright : (c) 2019 Composewell Technologies -- -- License : BSD3 -- Maintainer : streamly@composewell.com -- Stability : released -- Portability : GHC -- -- Combinators to build Inet\/IPv4/TCP clients and servers. -- -- >>> import qualified Streamly.Network.Inet.TCP as TCP -- -- = Examples -- -- Following is a short example of a concurrent echo server. -- -- >>> import Control.Monad.Catch (finally) -- >>> import Data.Function ((&)) -- >>> import Network.Socket (Socket) -- >>> -- >>> import qualified Network.Socket as Net -- >>> import qualified Streamly.Data.Fold as Fold -- >>> import qualified Streamly.Data.Stream.Prelude as Stream -- >>> import qualified Streamly.Network.Inet.TCP as TCP -- >>> import qualified Streamly.Network.Socket as Socket -- >>> -- >>> :{ -- main :: IO () -- main = -- TCP.accept 8091 -- Stream IO Socket -- & Stream.parMapM id (handleExceptions echo) -- Stream IO () -- & Stream.fold Fold.drain -- IO () -- where -- echo :: Socket -> IO () -- echo sk = -- Socket.readChunksWith 32768 sk -- Stream IO (Array Word8) -- & Stream.fold (Socket.writeChunks sk) -- IO () -- handleExceptions :: (Socket -> IO ()) -> Socket -> IO () -- handleExceptions f sk = finally (f sk) (Net.close sk) -- :} module Streamly.Network.Inet.TCP ( -- * Accept Connections -- ** Streams accept , acceptLocal , acceptOnAddr , acceptOnAddrWith -- ** Unfolds , acceptor , acceptorLocal , acceptorOnAddr -- * Connect to Servers , connect {- -- XXX Expose this as a pipe when we have pipes. -- * Transformation -- , pipeBytes -- ** Sink Servers -- These abstractions can be applied to any setting where we need to do a -- sink processing of multiple streams e.g. output from multiple processes -- or data coming from multiple files. -- handle connections concurrently using a specified fold -- , handleConnections -- handle frames concurrently using a specified fold , handleFrames -- merge frames from all connection into a single stream. Frames can be -- created by a specified fold. , mergeFrames -- * UDP Servers , datagrams , datagramsOn -} -- * Deprecated , acceptorOnPort , acceptorOnPortLocal ) where import Streamly.Internal.Network.Inet.TCP