module JSDOM.Custom.Navigator (
module Generated
, getUserMedia
) where
import Data.Maybe (fromJust)
import Control.Monad.IO.Class (MonadIO(..))
import Control.Concurrent.MVar (takeMVar, putMVar, newEmptyMVar)
import JSDOM.Types
(withCallback, Callback(..), MediaStream(..), NavigatorUserMediaError(..),
Dictionary(..), MonadDOM, NavigatorUserMediaSuccessCallback(..),
NavigatorUserMediaErrorCallback(..))
import JSDOM.Custom.NavigatorUserMediaError (throwUserMediaException)
import JSDOM.Generated.NavigatorUserMediaSuccessCallback
(newNavigatorUserMediaSuccessCallback)
import JSDOM.Generated.NavigatorUserMediaErrorCallback
(newNavigatorUserMediaErrorCallback)
import JSDOM.Generated.Navigator as Generated hiding (getUserMedia)
import qualified JSDOM.Generated.Navigator
as Generated (webkitGetUserMedia)
getUserMedia' :: MonadDOM m => Navigator -> Maybe Dictionary -> m (Either NavigatorUserMediaError MediaStream)
getUserMedia' self options = do
result <- liftIO newEmptyMVar
withCallback (newNavigatorUserMediaSuccessCallback (liftIO . putMVar result . Right . fromJust)) $ \success ->
withCallback (newNavigatorUserMediaErrorCallback (liftIO . putMVar result . Left . fromJust)) $ \error -> do
Generated.webkitGetUserMedia self options (Just success) (Just error)
liftIO $ takeMVar result
getUserMedia :: MonadDOM m => Navigator -> Maybe Dictionary -> m MediaStream
getUserMedia self options = getUserMedia' self options >>= either throwUserMediaException return