{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
module Network.Pusher
(
Settings (..),
defaultSettings,
Token (..),
Address (..),
Pusher,
newPusher,
newPusherWithConnManager,
trigger,
triggerBatch,
Event (..),
channels,
channel,
users,
authenticatePresence,
authenticatePrivate,
PusherError (..),
parseWebhookPayload,
WebhookEv (..),
WebhookPayload (..),
Webhooks (..),
parseAppKeyHdr,
parseAuthSignatureHdr,
parseWebhooksBody,
verifyWebhooksBody,
parseWebhookPayloadWith,
)
where
import Control.Monad.IO.Class
( MonadIO,
liftIO,
)
import qualified Data.Aeson as A
import qualified Data.ByteString as B
import qualified Data.Text as T
import Network.Pusher.Data
( Address (..),
Event (..),
Pusher (..),
Settings (..),
Token (..),
defaultSettings,
newPusher,
newPusherWithConnManager,
)
import Network.Pusher.Error (PusherError (..))
import qualified Network.Pusher.Internal as Pusher
import qualified Network.Pusher.Internal.Auth as Auth
import qualified Network.Pusher.Internal.HTTP as HTTP
import Network.Pusher.Internal.Util (getSystemTimeSeconds)
import Network.Pusher.Protocol
( ChannelInfoQuery,
ChannelsInfo,
ChannelsInfoQuery,
FullChannelInfo,
Users,
)
import Network.Pusher.Webhook
( WebhookEv (..),
WebhookPayload (..),
Webhooks (..),
parseAppKeyHdr,
parseAuthSignatureHdr,
parseWebhookPayloadWith,
parseWebhooksBody,
verifyWebhooksBody,
)
trigger ::
MonadIO m =>
Pusher ->
[T.Text] ->
T.Text ->
T.Text ->
Maybe T.Text ->
m (Either PusherError ())
trigger :: forall (m :: * -> *).
MonadIO m =>
Pusher
-> [Text]
-> Text
-> Text
-> Maybe Text
-> m (Either PusherError ())
trigger Pusher
pusher [Text]
chans Text
event Text
dat Maybe Text
socketId = do
(RequestParams
requestParams, Value
requestBody) <-
Pusher
-> [Text]
-> Text
-> Text
-> Maybe Text
-> Word64
-> (RequestParams, Value)
Pusher.mkTriggerRequest Pusher
pusher [Text]
chans Text
event Text
dat Maybe Text
socketId
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). MonadIO m => m Word64
getSystemTimeSeconds
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a.
ToJSON a =>
Manager -> RequestParams -> a -> IO (Either PusherError ())
HTTP.post (Pusher -> Manager
pConnectionManager Pusher
pusher) RequestParams
requestParams Value
requestBody
triggerBatch ::
MonadIO m =>
Pusher ->
[Event] ->
m (Either PusherError ())
triggerBatch :: forall (m :: * -> *).
MonadIO m =>
Pusher -> [Event] -> m (Either PusherError ())
triggerBatch Pusher
pusher [Event]
events = do
(RequestParams
requestParams, Value
requestBody) <-
Pusher -> [Event] -> Word64 -> (RequestParams, Value)
Pusher.mkTriggerBatchRequest Pusher
pusher [Event]
events forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). MonadIO m => m Word64
getSystemTimeSeconds
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a.
ToJSON a =>
Manager -> RequestParams -> a -> IO (Either PusherError ())
HTTP.post (Pusher -> Manager
pConnectionManager Pusher
pusher) RequestParams
requestParams Value
requestBody
channels ::
MonadIO m =>
Pusher ->
T.Text ->
ChannelsInfoQuery ->
m (Either PusherError ChannelsInfo)
channels :: forall (m :: * -> *).
MonadIO m =>
Pusher
-> Text -> ChannelsInfoQuery -> m (Either PusherError ChannelsInfo)
channels Pusher
pusher Text
prefixFilter ChannelsInfoQuery
attributes = do
RequestParams
requestParams <-
Pusher -> Text -> ChannelsInfoQuery -> Word64 -> RequestParams
Pusher.mkChannelsRequest Pusher
pusher Text
prefixFilter ChannelsInfoQuery
attributes
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). MonadIO m => m Word64
getSystemTimeSeconds
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a.
FromJSON a =>
Manager -> RequestParams -> IO (Either PusherError a)
HTTP.get (Pusher -> Manager
pConnectionManager Pusher
pusher) RequestParams
requestParams
channel ::
MonadIO m =>
Pusher ->
B.ByteString ->
ChannelInfoQuery ->
m (Either PusherError FullChannelInfo)
channel :: forall (m :: * -> *).
MonadIO m =>
Pusher
-> ByteString
-> ChannelInfoQuery
-> m (Either PusherError FullChannelInfo)
channel Pusher
pusher ByteString
chan ChannelInfoQuery
attributes = do
RequestParams
requestParams <-
Pusher -> ByteString -> ChannelInfoQuery -> Word64 -> RequestParams
Pusher.mkChannelRequest Pusher
pusher ByteString
chan ChannelInfoQuery
attributes forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). MonadIO m => m Word64
getSystemTimeSeconds
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a.
FromJSON a =>
Manager -> RequestParams -> IO (Either PusherError a)
HTTP.get (Pusher -> Manager
pConnectionManager Pusher
pusher) RequestParams
requestParams
users :: MonadIO m => Pusher -> B.ByteString -> m (Either PusherError Users)
users :: forall (m :: * -> *).
MonadIO m =>
Pusher -> ByteString -> m (Either PusherError Users)
users Pusher
pusher ByteString
chan = do
RequestParams
requestParams <- Pusher -> ByteString -> Word64 -> RequestParams
Pusher.mkUsersRequest Pusher
pusher ByteString
chan forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *). MonadIO m => m Word64
getSystemTimeSeconds
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO forall a b. (a -> b) -> a -> b
$ forall a.
FromJSON a =>
Manager -> RequestParams -> IO (Either PusherError a)
HTTP.get (Pusher -> Manager
pConnectionManager Pusher
pusher) RequestParams
requestParams
authenticatePrivate :: Pusher -> T.Text -> T.Text -> B.ByteString
authenticatePrivate :: Pusher -> Text -> Text -> ByteString
authenticatePrivate Pusher
pusher = Token -> Text -> Text -> ByteString
Auth.authenticatePrivate (Pusher -> Token
pToken Pusher
pusher)
authenticatePresence ::
A.ToJSON a => Pusher -> T.Text -> T.Text -> a -> B.ByteString
authenticatePresence :: forall a. ToJSON a => Pusher -> Text -> Text -> a -> ByteString
authenticatePresence Pusher
pusher = forall a. ToJSON a => Token -> Text -> Text -> a -> ByteString
Auth.authenticatePresence (Pusher -> Token
pToken Pusher
pusher)
parseWebhookPayload ::
Pusher ->
[(B.ByteString, B.ByteString)] ->
B.ByteString ->
Maybe WebhookPayload
parseWebhookPayload :: Pusher
-> [(ByteString, ByteString)] -> ByteString -> Maybe WebhookPayload
parseWebhookPayload Pusher
pusher =
let token :: Token
token = Pusher -> Token
pToken Pusher
pusher
ourAppKey :: ByteString
ourAppKey = Token -> ByteString
tokenKey Token
token
ourAppSecret :: ByteString
ourAppSecret = Token -> ByteString
tokenSecret Token
token
lookupKeysSecret :: ByteString -> Maybe ByteString
lookupKeysSecret ByteString
whAppKey =
if ByteString
whAppKey forall a. Eq a => a -> a -> Bool
== ByteString
ourAppKey then forall a. a -> Maybe a
Just ByteString
ourAppSecret else forall a. Maybe a
Nothing
in (ByteString -> Maybe ByteString)
-> [(ByteString, ByteString)] -> ByteString -> Maybe WebhookPayload
parseWebhookPayloadWith ByteString -> Maybe ByteString
lookupKeysSecret