cdp: A library for the Chrome Devtools Protocol

[ bsd3, chrome, library, package.category, program ] [ Propose Tags ]

A library for the Chrome Devtools Protocol (CDP). It provides access to Chrome, enabling tasks such as printing a page or opening a tab.

Chrome Devtools Protocol: https://chromedevtools.github.io/devtools-protocol/

README: https://github.com/arsalan0c/cdp-hs

Examples: https://github.com/arsalan0c/cdp-hs/examples


[Skip to Readme]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.0.1.0, 0.0.1.1, 0.0.2.0
Dependencies aeson (>=1.5.6 && <1.6), base (>=4.14.3 && <4.15), base64-bytestring (>=1.1.0 && <1.2), blaze-html (>=0.9.1 && <0.10), blaze-markup (>=0.8.2 && <0.9), bytestring (>=0.10.12 && <0.11), cdp, containers (>=0.6.5 && <0.7), data-default (>=0.7.1 && <0.8), directory (>=1.3.6 && <1.4), extra (>=1.7.9 && <1.8), filepath (>=1.4.2 && <1.5), http-conduit (>=2.3.8 && <2.4), monad-loops (>=0.4.3 && <0.5), mtl (>=2.2.2 && <2.3), network-uri (>=2.6.4 && <2.7), process (>=1.6.13 && <1.7), random (>=1.2.0 && <1.3), text (>=1.2.4 && <1.3), utf8-string (>=1.0.2 && <1.1), vector (>=0.12.3 && <0.13), websockets (>=0.12.7 && <0.13) [details]
License BSD-3-Clause
Author Arsalan Cheema
Maintainer Arsalan Cheema
Category Package.Category
Home page https://github.com/arsalan0c/cdp-hs#readme
Bug tracker https://github.com/arsalan0c/cdp-hs/issues
Source repo head: git clone https://github.com/arsalan0c/cdp-hs
Uploaded by arsalan0c at 2022-12-24T10:43:34Z
Distributions
Executables cdp-gen, cdp-example-subscribe, cdp-example-sessions, cdp-example-print-page, cdp-example-open-twitter, cdp-example-endpoints
Downloads 147 total (8 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for cdp-0.0.2.0

[back to package description]

build

cdp-hs

A Haskell library for the Chrome Devtools Protocol (CDP), generated from the protocol's definition files.

Example usage

Ensure Chrome is running with the remote debugging port enabled:

$ chromium --headless --remote-debugging-port=9222 https://wikipedia.com

The following program can be used to print a page to PDF, with Base64 encoded data being read in chunks:

{-# LANGUAGE OverloadedStrings   #-}

module Main where

import Data.Maybe
import Data.Default
import qualified Data.ByteString.Base64.Lazy as Base64
import qualified Data.ByteString.Lazy as BL
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.Encoding as TL

import qualified CDP as CDP

main :: IO ()
main = CDP.runClient def printPDF

printPDF :: CDP.Handle -> IO ()
printPDF handle = do
    -- send the Page.printToPDF command
    r <- CDP.sendCommandWait handle $ CDP.pPagePrintToPDF
        { CDP.pPagePrintToPDFTransferMode = Just CDP.PPagePrintToPDFTransferModeReturnAsStream
        }

    -- obtain stream handle from which to read pdf data
    let streamHandle = fromJust . CDP.pagePrintToPDFStream $ r

    -- read pdf data 24000 bytes at a time
    let params = CDP.PIORead streamHandle Nothing $ Just 24000
    reads <- whileTrue (not . CDP.iOReadEof) $ CDP.sendCommandWait handle params
    let dat = map decode reads
    BL.writeFile "mypdf.pdf" $ BL.concat dat

decode :: CDP.IORead -> BL.ByteString
decode ior = if (CDP.iOReadBase64Encoded ior == Just True)
    then Base64.decodeLenient lbs
    else lbs
  where
    lbs = TL.encodeUtf8 . TL.fromStrict . CDP.iOReadData $ ior

whileTrue :: Monad m => (a -> Bool) -> m a -> m [a]
whileTrue f act = do
    a <- act
    if f a
        then pure . (a :) =<< whileTrue f act
        else pure [a]

More examples can be found in examples.

Generating the CDP library

cabal run cdp-gen

Current state

Project board

Commands and events for all non-deprecated domains are supported.

Sessions can also be created with a target (such as a tab), which can be used to restrict the scope of commands and events for the target. See examples/sessions.hs for example usage.

Contributing

PRs are welcome! If you would like to discuss changes or have any feedback, feel free to open an issue.

Acknowledgements

This began as a Summer of Haskell / GSoC project. Albert Krewinkel (@tarleb), Jasper Van der Jeugt (@jaspervdj) and Romain Lesur (@RLesur) provided valuable feedback and support which along with raising the library's quality, has made this all the more enjoyable to work on.

References