Как открыть отдельное сокетное соединение в Scotty или Yesod?

Я создаю приложение, которое должно подключиться к сети IRC (открыть сокет), а также разместить веб-приложение. Некоторые данные должны быть разделены между IRC-частью и Http-частью. Каков наилучший способ достижения такого параллелизма в Haskell? Должен Control.Monad.STM быть использованы для реализации этого? Это то, что веб-фреймворк должен поддерживать, или это возможно, чтобы раскошелиться до запуска Скотти?

1 ответ

Я нашел следующие работы на удивление великолепными. Я закончил тем, что использовал STM.TQueue.

listen :: SSL.SSL -> IO ()
listen ssl = do
  lines <- BL.lines `fmap` SSL.lazyRead ssl
  mapM_ (processLine ssl . show) lines

processQueue :: SSL.SSL -> TQueue String -> IO ()
processQueue ssl queue = forever $ do newData <- atomically $ readTQueue queue
                                      privmsg ssl newData

web_service :: TQueue String -> IO ()
web_service queue = scotty 25000 $ do
  get "/" $ do
    liftIO $ atomically $ writeTQueue queue "test passed"    
    status ok200

irc_bot :: [AddrInfo] -> TQueue String -> IO ()
irc_bot addrs queue = do ssl <- connectToServer (head addrs)
                         forkIO $ listen ssl
                         processQueue ssl queue

main = withOpenSSL $ do
  let hints = defaultHints { addrSocketType = Stream, addrFamily = AF_INET }
  addrs <- getAddrInfo (Just hints) (Just "irc.freenode.com") (Just "6697")
  queue <- atomically newTQueue
  forkIO $ irc_bot addrs queue
  web_service queue
Другие вопросы по тегам