cdp-0.0.1.0: src/CDP/Domains/SystemInfo.hs
{-# LANGUAGE OverloadedStrings, RecordWildCards, TupleSections #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeFamilies #-}
{- |
= SystemInfo
The SystemInfo domain defines methods and events for querying low-level system information.
-}
module CDP.Domains.SystemInfo (module CDP.Domains.SystemInfo) where
import Control.Applicative ((<$>))
import Control.Monad
import Control.Monad.Loops
import Control.Monad.Trans (liftIO)
import qualified Data.Map as M
import Data.Maybe
import Data.Functor.Identity
import Data.String
import qualified Data.Text as T
import qualified Data.List as List
import qualified Data.Text.IO as TI
import qualified Data.Vector as V
import Data.Aeson.Types (Parser(..))
import Data.Aeson (FromJSON (..), ToJSON (..), (.:), (.:?), (.=), (.!=), (.:!))
import qualified Data.Aeson as A
import qualified Network.HTTP.Simple as Http
import qualified Network.URI as Uri
import qualified Network.WebSockets as WS
import Control.Concurrent
import qualified Data.ByteString.Lazy as BS
import qualified Data.Map as Map
import Data.Proxy
import System.Random
import GHC.Generics
import Data.Char
import Data.Default
import CDP.Internal.Utils
-- | Type 'SystemInfo.GPUDevice'.
-- Describes a single graphics processor (GPU).
data SystemInfoGPUDevice = SystemInfoGPUDevice
{
-- | PCI ID of the GPU vendor, if available; 0 otherwise.
systemInfoGPUDeviceVendorId :: Double,
-- | PCI ID of the GPU device, if available; 0 otherwise.
systemInfoGPUDeviceDeviceId :: Double,
-- | Sub sys ID of the GPU, only available on Windows.
systemInfoGPUDeviceSubSysId :: Maybe Double,
-- | Revision of the GPU, only available on Windows.
systemInfoGPUDeviceRevision :: Maybe Double,
-- | String description of the GPU vendor, if the PCI ID is not available.
systemInfoGPUDeviceVendorString :: T.Text,
-- | String description of the GPU device, if the PCI ID is not available.
systemInfoGPUDeviceDeviceString :: T.Text,
-- | String description of the GPU driver vendor.
systemInfoGPUDeviceDriverVendor :: T.Text,
-- | String description of the GPU driver version.
systemInfoGPUDeviceDriverVersion :: T.Text
}
deriving (Eq, Show)
instance FromJSON SystemInfoGPUDevice where
parseJSON = A.withObject "SystemInfoGPUDevice" $ \o -> SystemInfoGPUDevice
<$> o A..: "vendorId"
<*> o A..: "deviceId"
<*> o A..:? "subSysId"
<*> o A..:? "revision"
<*> o A..: "vendorString"
<*> o A..: "deviceString"
<*> o A..: "driverVendor"
<*> o A..: "driverVersion"
instance ToJSON SystemInfoGPUDevice where
toJSON p = A.object $ catMaybes [
("vendorId" A..=) <$> Just (systemInfoGPUDeviceVendorId p),
("deviceId" A..=) <$> Just (systemInfoGPUDeviceDeviceId p),
("subSysId" A..=) <$> (systemInfoGPUDeviceSubSysId p),
("revision" A..=) <$> (systemInfoGPUDeviceRevision p),
("vendorString" A..=) <$> Just (systemInfoGPUDeviceVendorString p),
("deviceString" A..=) <$> Just (systemInfoGPUDeviceDeviceString p),
("driverVendor" A..=) <$> Just (systemInfoGPUDeviceDriverVendor p),
("driverVersion" A..=) <$> Just (systemInfoGPUDeviceDriverVersion p)
]
-- | Type 'SystemInfo.Size'.
-- Describes the width and height dimensions of an entity.
data SystemInfoSize = SystemInfoSize
{
-- | Width in pixels.
systemInfoSizeWidth :: Int,
-- | Height in pixels.
systemInfoSizeHeight :: Int
}
deriving (Eq, Show)
instance FromJSON SystemInfoSize where
parseJSON = A.withObject "SystemInfoSize" $ \o -> SystemInfoSize
<$> o A..: "width"
<*> o A..: "height"
instance ToJSON SystemInfoSize where
toJSON p = A.object $ catMaybes [
("width" A..=) <$> Just (systemInfoSizeWidth p),
("height" A..=) <$> Just (systemInfoSizeHeight p)
]
-- | Type 'SystemInfo.VideoDecodeAcceleratorCapability'.
-- Describes a supported video decoding profile with its associated minimum and
-- maximum resolutions.
data SystemInfoVideoDecodeAcceleratorCapability = SystemInfoVideoDecodeAcceleratorCapability
{
-- | Video codec profile that is supported, e.g. VP9 Profile 2.
systemInfoVideoDecodeAcceleratorCapabilityProfile :: T.Text,
-- | Maximum video dimensions in pixels supported for this |profile|.
systemInfoVideoDecodeAcceleratorCapabilityMaxResolution :: SystemInfoSize,
-- | Minimum video dimensions in pixels supported for this |profile|.
systemInfoVideoDecodeAcceleratorCapabilityMinResolution :: SystemInfoSize
}
deriving (Eq, Show)
instance FromJSON SystemInfoVideoDecodeAcceleratorCapability where
parseJSON = A.withObject "SystemInfoVideoDecodeAcceleratorCapability" $ \o -> SystemInfoVideoDecodeAcceleratorCapability
<$> o A..: "profile"
<*> o A..: "maxResolution"
<*> o A..: "minResolution"
instance ToJSON SystemInfoVideoDecodeAcceleratorCapability where
toJSON p = A.object $ catMaybes [
("profile" A..=) <$> Just (systemInfoVideoDecodeAcceleratorCapabilityProfile p),
("maxResolution" A..=) <$> Just (systemInfoVideoDecodeAcceleratorCapabilityMaxResolution p),
("minResolution" A..=) <$> Just (systemInfoVideoDecodeAcceleratorCapabilityMinResolution p)
]
-- | Type 'SystemInfo.VideoEncodeAcceleratorCapability'.
-- Describes a supported video encoding profile with its associated maximum
-- resolution and maximum framerate.
data SystemInfoVideoEncodeAcceleratorCapability = SystemInfoVideoEncodeAcceleratorCapability
{
-- | Video codec profile that is supported, e.g H264 Main.
systemInfoVideoEncodeAcceleratorCapabilityProfile :: T.Text,
-- | Maximum video dimensions in pixels supported for this |profile|.
systemInfoVideoEncodeAcceleratorCapabilityMaxResolution :: SystemInfoSize,
-- | Maximum encoding framerate in frames per second supported for this
-- |profile|, as fraction's numerator and denominator, e.g. 24/1 fps,
-- 24000/1001 fps, etc.
systemInfoVideoEncodeAcceleratorCapabilityMaxFramerateNumerator :: Int,
systemInfoVideoEncodeAcceleratorCapabilityMaxFramerateDenominator :: Int
}
deriving (Eq, Show)
instance FromJSON SystemInfoVideoEncodeAcceleratorCapability where
parseJSON = A.withObject "SystemInfoVideoEncodeAcceleratorCapability" $ \o -> SystemInfoVideoEncodeAcceleratorCapability
<$> o A..: "profile"
<*> o A..: "maxResolution"
<*> o A..: "maxFramerateNumerator"
<*> o A..: "maxFramerateDenominator"
instance ToJSON SystemInfoVideoEncodeAcceleratorCapability where
toJSON p = A.object $ catMaybes [
("profile" A..=) <$> Just (systemInfoVideoEncodeAcceleratorCapabilityProfile p),
("maxResolution" A..=) <$> Just (systemInfoVideoEncodeAcceleratorCapabilityMaxResolution p),
("maxFramerateNumerator" A..=) <$> Just (systemInfoVideoEncodeAcceleratorCapabilityMaxFramerateNumerator p),
("maxFramerateDenominator" A..=) <$> Just (systemInfoVideoEncodeAcceleratorCapabilityMaxFramerateDenominator p)
]
-- | Type 'SystemInfo.SubsamplingFormat'.
-- YUV subsampling type of the pixels of a given image.
data SystemInfoSubsamplingFormat = SystemInfoSubsamplingFormatYuv420 | SystemInfoSubsamplingFormatYuv422 | SystemInfoSubsamplingFormatYuv444
deriving (Ord, Eq, Show, Read)
instance FromJSON SystemInfoSubsamplingFormat where
parseJSON = A.withText "SystemInfoSubsamplingFormat" $ \v -> case v of
"yuv420" -> pure SystemInfoSubsamplingFormatYuv420
"yuv422" -> pure SystemInfoSubsamplingFormatYuv422
"yuv444" -> pure SystemInfoSubsamplingFormatYuv444
"_" -> fail "failed to parse SystemInfoSubsamplingFormat"
instance ToJSON SystemInfoSubsamplingFormat where
toJSON v = A.String $ case v of
SystemInfoSubsamplingFormatYuv420 -> "yuv420"
SystemInfoSubsamplingFormatYuv422 -> "yuv422"
SystemInfoSubsamplingFormatYuv444 -> "yuv444"
-- | Type 'SystemInfo.ImageType'.
-- Image format of a given image.
data SystemInfoImageType = SystemInfoImageTypeJpeg | SystemInfoImageTypeWebp | SystemInfoImageTypeUnknown
deriving (Ord, Eq, Show, Read)
instance FromJSON SystemInfoImageType where
parseJSON = A.withText "SystemInfoImageType" $ \v -> case v of
"jpeg" -> pure SystemInfoImageTypeJpeg
"webp" -> pure SystemInfoImageTypeWebp
"unknown" -> pure SystemInfoImageTypeUnknown
"_" -> fail "failed to parse SystemInfoImageType"
instance ToJSON SystemInfoImageType where
toJSON v = A.String $ case v of
SystemInfoImageTypeJpeg -> "jpeg"
SystemInfoImageTypeWebp -> "webp"
SystemInfoImageTypeUnknown -> "unknown"
-- | Type 'SystemInfo.ImageDecodeAcceleratorCapability'.
-- Describes a supported image decoding profile with its associated minimum and
-- maximum resolutions and subsampling.
data SystemInfoImageDecodeAcceleratorCapability = SystemInfoImageDecodeAcceleratorCapability
{
-- | Image coded, e.g. Jpeg.
systemInfoImageDecodeAcceleratorCapabilityImageType :: SystemInfoImageType,
-- | Maximum supported dimensions of the image in pixels.
systemInfoImageDecodeAcceleratorCapabilityMaxDimensions :: SystemInfoSize,
-- | Minimum supported dimensions of the image in pixels.
systemInfoImageDecodeAcceleratorCapabilityMinDimensions :: SystemInfoSize,
-- | Optional array of supported subsampling formats, e.g. 4:2:0, if known.
systemInfoImageDecodeAcceleratorCapabilitySubsamplings :: [SystemInfoSubsamplingFormat]
}
deriving (Eq, Show)
instance FromJSON SystemInfoImageDecodeAcceleratorCapability where
parseJSON = A.withObject "SystemInfoImageDecodeAcceleratorCapability" $ \o -> SystemInfoImageDecodeAcceleratorCapability
<$> o A..: "imageType"
<*> o A..: "maxDimensions"
<*> o A..: "minDimensions"
<*> o A..: "subsamplings"
instance ToJSON SystemInfoImageDecodeAcceleratorCapability where
toJSON p = A.object $ catMaybes [
("imageType" A..=) <$> Just (systemInfoImageDecodeAcceleratorCapabilityImageType p),
("maxDimensions" A..=) <$> Just (systemInfoImageDecodeAcceleratorCapabilityMaxDimensions p),
("minDimensions" A..=) <$> Just (systemInfoImageDecodeAcceleratorCapabilityMinDimensions p),
("subsamplings" A..=) <$> Just (systemInfoImageDecodeAcceleratorCapabilitySubsamplings p)
]
-- | Type 'SystemInfo.GPUInfo'.
-- Provides information about the GPU(s) on the system.
data SystemInfoGPUInfo = SystemInfoGPUInfo
{
-- | The graphics devices on the system. Element 0 is the primary GPU.
systemInfoGPUInfoDevices :: [SystemInfoGPUDevice],
-- | An optional dictionary of additional GPU related attributes.
systemInfoGPUInfoAuxAttributes :: Maybe [(T.Text, T.Text)],
-- | An optional dictionary of graphics features and their status.
systemInfoGPUInfoFeatureStatus :: Maybe [(T.Text, T.Text)],
-- | An optional array of GPU driver bug workarounds.
systemInfoGPUInfoDriverBugWorkarounds :: [T.Text],
-- | Supported accelerated video decoding capabilities.
systemInfoGPUInfoVideoDecoding :: [SystemInfoVideoDecodeAcceleratorCapability],
-- | Supported accelerated video encoding capabilities.
systemInfoGPUInfoVideoEncoding :: [SystemInfoVideoEncodeAcceleratorCapability],
-- | Supported accelerated image decoding capabilities.
systemInfoGPUInfoImageDecoding :: [SystemInfoImageDecodeAcceleratorCapability]
}
deriving (Eq, Show)
instance FromJSON SystemInfoGPUInfo where
parseJSON = A.withObject "SystemInfoGPUInfo" $ \o -> SystemInfoGPUInfo
<$> o A..: "devices"
<*> o A..:? "auxAttributes"
<*> o A..:? "featureStatus"
<*> o A..: "driverBugWorkarounds"
<*> o A..: "videoDecoding"
<*> o A..: "videoEncoding"
<*> o A..: "imageDecoding"
instance ToJSON SystemInfoGPUInfo where
toJSON p = A.object $ catMaybes [
("devices" A..=) <$> Just (systemInfoGPUInfoDevices p),
("auxAttributes" A..=) <$> (systemInfoGPUInfoAuxAttributes p),
("featureStatus" A..=) <$> (systemInfoGPUInfoFeatureStatus p),
("driverBugWorkarounds" A..=) <$> Just (systemInfoGPUInfoDriverBugWorkarounds p),
("videoDecoding" A..=) <$> Just (systemInfoGPUInfoVideoDecoding p),
("videoEncoding" A..=) <$> Just (systemInfoGPUInfoVideoEncoding p),
("imageDecoding" A..=) <$> Just (systemInfoGPUInfoImageDecoding p)
]
-- | Type 'SystemInfo.ProcessInfo'.
-- Represents process info.
data SystemInfoProcessInfo = SystemInfoProcessInfo
{
-- | Specifies process type.
systemInfoProcessInfoType :: T.Text,
-- | Specifies process id.
systemInfoProcessInfoId :: Int,
-- | Specifies cumulative CPU usage in seconds across all threads of the
-- process since the process start.
systemInfoProcessInfoCpuTime :: Double
}
deriving (Eq, Show)
instance FromJSON SystemInfoProcessInfo where
parseJSON = A.withObject "SystemInfoProcessInfo" $ \o -> SystemInfoProcessInfo
<$> o A..: "type"
<*> o A..: "id"
<*> o A..: "cpuTime"
instance ToJSON SystemInfoProcessInfo where
toJSON p = A.object $ catMaybes [
("type" A..=) <$> Just (systemInfoProcessInfoType p),
("id" A..=) <$> Just (systemInfoProcessInfoId p),
("cpuTime" A..=) <$> Just (systemInfoProcessInfoCpuTime p)
]
-- | Returns information about the system.
-- | Parameters of the 'SystemInfo.getInfo' command.
data PSystemInfoGetInfo = PSystemInfoGetInfo
deriving (Eq, Show)
pSystemInfoGetInfo
:: PSystemInfoGetInfo
pSystemInfoGetInfo
= PSystemInfoGetInfo
instance ToJSON PSystemInfoGetInfo where
toJSON _ = A.Null
data SystemInfoGetInfo = SystemInfoGetInfo
{
-- | Information about the GPUs on the system.
systemInfoGetInfoGpu :: SystemInfoGPUInfo,
-- | A platform-dependent description of the model of the machine. On Mac OS, this is, for
-- example, 'MacBookPro'. Will be the empty string if not supported.
systemInfoGetInfoModelName :: T.Text,
-- | A platform-dependent description of the version of the machine. On Mac OS, this is, for
-- example, '10.1'. Will be the empty string if not supported.
systemInfoGetInfoModelVersion :: T.Text,
-- | The command line string used to launch the browser. Will be the empty string if not
-- supported.
systemInfoGetInfoCommandLine :: T.Text
}
deriving (Eq, Show)
instance FromJSON SystemInfoGetInfo where
parseJSON = A.withObject "SystemInfoGetInfo" $ \o -> SystemInfoGetInfo
<$> o A..: "gpu"
<*> o A..: "modelName"
<*> o A..: "modelVersion"
<*> o A..: "commandLine"
instance Command PSystemInfoGetInfo where
type CommandResponse PSystemInfoGetInfo = SystemInfoGetInfo
commandName _ = "SystemInfo.getInfo"
-- | Returns information about all running processes.
-- | Parameters of the 'SystemInfo.getProcessInfo' command.
data PSystemInfoGetProcessInfo = PSystemInfoGetProcessInfo
deriving (Eq, Show)
pSystemInfoGetProcessInfo
:: PSystemInfoGetProcessInfo
pSystemInfoGetProcessInfo
= PSystemInfoGetProcessInfo
instance ToJSON PSystemInfoGetProcessInfo where
toJSON _ = A.Null
data SystemInfoGetProcessInfo = SystemInfoGetProcessInfo
{
-- | An array of process info blocks.
systemInfoGetProcessInfoProcessInfo :: [SystemInfoProcessInfo]
}
deriving (Eq, Show)
instance FromJSON SystemInfoGetProcessInfo where
parseJSON = A.withObject "SystemInfoGetProcessInfo" $ \o -> SystemInfoGetProcessInfo
<$> o A..: "processInfo"
instance Command PSystemInfoGetProcessInfo where
type CommandResponse PSystemInfoGetProcessInfo = SystemInfoGetProcessInfo
commandName _ = "SystemInfo.getProcessInfo"