udp-conduit (empty) → 0.1.0.0
raw patch · 5 files changed
+136/−0 lines, 5 filesdep +basedep +chunked-datadep +conduit-combinatorssetup-changed
Dependencies added: base, chunked-data, conduit-combinators, mono-traversable, network
Files
- LICENSE +13/−0
- README.md +38/−0
- Setup.hs +2/−0
- src/Conduit/UDP.hs +52/−0
- udp-conduit.cabal +31/−0
+ LICENSE view
@@ -0,0 +1,13 @@+Copyright (c) kqr 2016++Permission to use, copy, modify, and/or distribute this software for any+purpose with or without fee is hereby granted, provided that the above+copyright notice and this permission notice appear in all copies.++THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND+FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR+PERFORMANCE OF THIS SOFTWARE.
+ README.md view
@@ -0,0 +1,38 @@+# udp-conduit++Simple fire-and-forget style conduit parts (sources/sinks) for UDP traffic.++Here's an example that sends a message to UDP port 8888 on localhost:++ import Conduit+ import Conduit.UDP+ import Data.Text++ message :: Text+ message = "hello, world!\n"++ main :: IO ()+ main =+ runConduitRes (yield message .| encodeUtf8C .| udpSink "127.0.0.1" 8888)++Here's an example where we continuously receive messages on port 5666 on localhost:++ import Conduit+ import Conduit.UDP++ main :: IO ()+ main =+ runConduitRes (udpSource "127.0.0.1" 5666 .| decodeUtf8C .| stdoutC)++Now, here's an example where we receive messages on port 8001, transform them to+upper-case, and then send them on to port 8002.++ import Conduit+ import Conduit.UDP+ import Data.Char (toUpper)++ main :: IO ()+ main =+ runConduitRes (udpSource "127.0.0.1" 8001 .| omapCE toUpper .| udpSink "127.0.0.1" 8002)++Fun, huh? And simple!
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ src/Conduit/UDP.hs view
@@ -0,0 +1,52 @@+module Conduit.UDP where+import Data.Void (Void)+import Data.IOData (IOData)+import Data.MonoTraversable (MonoFoldable)+import System.IO (IOMode(ReadMode, WriteMode), Handle)+import Network.Socket (Socket, SockAddr(SockAddrInet), PortNumber, setSocketOption, socketToHandle)+import qualified Network.Socket as Socket+import Conduit (ConduitM, MonadResource, sinkIOHandle, sourceIOHandle)+++data SocketType+ = SourceSocket+ | SinkSocket++ioMode :: SocketType -> IOMode+ioMode socketType =+ case socketType of+ SourceSocket -> ReadMode+ SinkSocket -> WriteMode++socketMode :: SocketType -> Socket -> SockAddr -> IO ()+socketMode socketType =+ case socketType of+ SourceSocket -> Socket.bind+ SinkSocket -> Socket.connect+++udpSink+ :: (MonadResource m, IOData a)+ => Prelude.String+ -> PortNumber+ -> ConduitM a Void m ()+udpSink host port =+ sinkIOHandle (udpHandle host port SinkSocket)+++udpSource+ :: (MonadResource m, IOData a, MonoFoldable a)+ => Prelude.String+ -> PortNumber+ -> ConduitM () a m ()+udpSource host port =+ sourceIOHandle (udpHandle host port SourceSocket)+++udpHandle :: Prelude.String -> PortNumber -> SocketType -> IO Handle+udpHandle host port socketType = do+ socket <- Socket.socket Socket.AF_INET Socket.Datagram Socket.defaultProtocol+ setSocketOption socket Socket.ReusePort 1+ address <- Socket.inet_addr host+ socketMode socketType socket (SockAddrInet port address)+ socketToHandle socket (ioMode socketType)
+ udp-conduit.cabal view
@@ -0,0 +1,31 @@+name: udp-conduit+version: 0.1.0.0+synopsis: Simple fire-and-forget conduit UDP wrappers+description:+ `udp-conduit` provides simple wrappers to get fire-and-forget UDP sinks+ and sources.+homepage: https://github.com/kqr/udp-conduit#readme+license: ISC+license-file: LICENSE+author: kqr+maintainer: k@rdw.se+copyright: (c) 2016 kqr+category: Data, Conduit+build-type: Simple+extra-source-files: README.md+cabal-version: >=1.10++library+ hs-source-dirs: src+ ghc-options: -Wall+ exposed-modules: Conduit.UDP+ build-depends: base >= 4.7 && < 5+ , mono-traversable+ , chunked-data+ , network+ , conduit-combinators+ default-language: Haskell2010++source-repository head+ type: git+ location: https://github.com/kqr/udp-conduit