cdp: A library for the Chrome Devtools Protocol

This is a package candidate release! Here you can preview how this package release will appear once published to the main package index (which can be accomplished via the 'maintain' link below). Please note that once a package has been published to the main package index it cannot be undone! Please consult the package uploading documentation for more information.

[maintain] [Publish]

A library for the Chrome Devtools Protocol (CDP). It serves as an interface 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]

Properties

Versions 0.0.1.0, 0.0.1.1, 0.0.1.1, 0.0.2.0
Change log None available
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-22T15:55:50Z

Modules

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Readme for cdp-0.0.1.1

[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 = do
    let cfg = def
    CDP.runClient cfg 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