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(..),
MediaStreamConstraints(..), 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 (getUserMedia)
getUserMedia' :: MonadDOM m => Navigator -> MediaStreamConstraints -> m (Either NavigatorUserMediaError MediaStream)
getUserMedia' self constraints = do
result <- liftIO newEmptyMVar
withCallback (newNavigatorUserMediaSuccessCallback (liftIO . putMVar result . Right)) $ \success ->
withCallback (newNavigatorUserMediaErrorCallback (liftIO . putMVar result . Left)) $ \error -> do
Generated.getUserMedia self constraints success error
liftIO $ takeMVar result
getUserMedia :: MonadDOM m => Navigator -> MediaStreamConstraints -> m MediaStream
getUserMedia self constraints = getUserMedia' self constraints >>= either throwUserMediaException return