From 1263f5af724484c78ea7f6b06088e4b71a179a20 Mon Sep 17 00:00:00 2001 From: Orion Kindel Date: Thu, 26 Oct 2023 15:49:54 -0500 Subject: [PATCH] fix: support eject / inject / exclusive event handlers --- .tool-versions | 6 +- bun.lockb | Bin 67459 -> 73987 bytes package.json | 9 +-- src/Puppeteer.Page.Event.ConsoleMessage.purs | 3 + src/Puppeteer.Page.Event.js | 13 +++++ src/Puppeteer.Page.Event.purs | 24 +++++++- test/Puppeteer.Page.Event.Spec.purs | 58 ++++++++++++++++++- 7 files changed, 103 insertions(+), 10 deletions(-) diff --git a/.tool-versions b/.tool-versions index fae5180..53f891e 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,3 +1,3 @@ -purescript 0.15.11-3 -spago 0.21.0 -bun 1.0.3 +purescript 0.15.12 +spago system 0.21.0 +bun 1.0.7 diff --git a/bun.lockb b/bun.lockb index d8c9f5d17dd205d98dbbec7d15ef117b75bba191..ed02faf32213a53e6bb8c6ab5fab6a34b1f33ba9 100755 GIT binary patch delta 16233 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

jwP2eK%6>tJL3Dg6%fF9uZUIDBI_^o6k;CEbe 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 delta 14760 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 diff --git a/package.json b/package.json index 976e491..e1cdfde 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "type": "module", "scripts": { "fmt": "bun bun/fmt.js", - "postinstall": "bunx @puppeteer/browsers install chrome@stable --path $HOME/.cache/puppeteer" + "postinstall": "rm -rf node_modules/puppeteer-extra/node_modules/" }, "devDependencies": { "bun-types": "latest", @@ -17,12 +17,13 @@ "dependencies": { "@cliqz/adblocker-puppeteer": "1.23.8", "callsites": "^4.1.0", - "puppeteer": "^21.3.5", - "puppeteer-core": "^21.3.5", + "puppeteer-core": "https://git.orionkindel.com/orion/-/packages/npm/puppeteer-core/0.0.2-fork/files/3271#.tgz", + "puppeteer": "https://git.orionkindel.com/orion/-/packages/npm/puppeteer/0.0.3-fork/files/3272#.tgz", "puppeteer-extra": "^3.3.6", "puppeteer-extra-plugin-adblocker": "^2.13.6", "puppeteer-extra-plugin-anonymize-ua": "^2.4.6", "puppeteer-extra-plugin-recaptcha": "^3.6.8", - "puppeteer-extra-plugin-stealth": "^2.11.2" + "puppeteer-extra-plugin-stealth": "^2.11.2", + "purescript-language-server": "latest" } } diff --git a/src/Puppeteer.Page.Event.ConsoleMessage.purs b/src/Puppeteer.Page.Event.ConsoleMessage.purs index 9c5a5a0..830f2e9 100644 --- a/src/Puppeteer.Page.Event.ConsoleMessage.purs +++ b/src/Puppeteer.Page.Event.ConsoleMessage.purs @@ -105,6 +105,9 @@ messageTypeString Verbose = "verbose" foreign import data ConsoleMessage :: Type +instance Show ConsoleMessage where + show m = show { text: text m, messageType: messageType m, stackTrace: stackTrace m, location: location m } + instance consoleMessageForeign :: ReadForeign ConsoleMessage where readImpl = pure <<< unsafeFromForeign diff --git a/src/Puppeteer.Page.Event.js b/src/Puppeteer.Page.Event.js index 20daeac..afdb382 100644 --- a/src/Puppeteer.Page.Event.js +++ b/src/Puppeteer.Page.Event.js @@ -1,5 +1,7 @@ import { Page } from 'puppeteer' +/** @typedef {import('puppeteer').EventsWithWildcard} Events */ + /** @type {(_0: import('puppeteer').PageEvent) => (_1: (_: any) => void) => (_2: Page) => () => [import('puppeteer').PageEvent, (_: any) => void]} */ export const _addListener = t => f => p => () => { p.on(t, f) @@ -15,3 +17,14 @@ export const _removeListener = /** @type {(_0: import('puppeteer').PageEvent) => (_1: (_: any) => void) => (_2: Page) => () => void} */ export const _once = t => f => p => () => p.once(t, f) + +/** @type {(_2: Page) => () => void} */ +export const removeAllListeners = p => () => p.removeAllListeners() + +/** @type {(_2: Page) => () => import('puppeteer').EmitterState} */ +export const eject = p => () => p.eject() + +/** @type {(_1: import('puppeteer').EmitterState) => (_2: Page) => () => void} */ +export const inject = s => p => () => { + p.inject(s) +} diff --git a/src/Puppeteer.Page.Event.purs b/src/Puppeteer.Page.Event.purs index 67d7e41..af9879d 100644 --- a/src/Puppeteer.Page.Event.purs +++ b/src/Puppeteer.Page.Event.purs @@ -1,5 +1,8 @@ module Puppeteer.Page.Event - ( once + ( exclusive + , inject + , eject + , once , listen , eventKey , eventData @@ -14,6 +17,7 @@ module Puppeteer.Page.Event , ResponseEvent(..) , DialogEvent(..) , ConsoleMessageEvent(..) + , EmitterState ) where import Prelude @@ -136,11 +140,16 @@ class Event ev d | ev -> d, d -> ev where defaultEventData :: forall d. ReadForeign d => Foreign -> Maybe d defaultEventData = hush <<< runExcept <<< readImpl +foreign import data EmitterState :: Type foreign import data ListenerToken :: Type foreign import _once :: String -> (Foreign -> Unit) -> Page -> Effect Unit foreign import _addListener :: String -> (Foreign -> Unit) -> Page -> Effect ListenerToken foreign import _removeListener :: ListenerToken -> Page -> Effect Unit +foreign import removeAllListeners :: Page -> Effect Unit +foreign import eject :: Page -> Effect EmitterState +foreign import inject :: EmitterState -> Page -> Effect Unit + once :: forall ev evd. Event ev evd => ev -> Page -> Aff evd once ev p = let @@ -152,6 +161,19 @@ once ev p = in makeAff f +exclusive :: forall ev evd. Event ev evd => ev -> (evd -> Effect Unit) -> Page -> Effect (Context "exclusive event listener") +exclusive ev cb p = + let + close before ctx _ = do + closeContext ctx + liftEffect $ inject before p + in + do + before <- eject p + removeAllListeners p + ev <- listen ev cb p + pure $ Context $ close before ev + listen :: forall ev evd. Event ev evd => ev -> (evd -> Effect Unit) -> Page -> Effect (Context "event listener") listen ev cb p = let diff --git a/test/Puppeteer.Page.Event.Spec.purs b/test/Puppeteer.Page.Event.Spec.purs index 621cadd..b24609c 100644 --- a/test/Puppeteer.Page.Event.Spec.purs +++ b/test/Puppeteer.Page.Event.Spec.purs @@ -2,21 +2,27 @@ module Puppeteer.Page.Event.Spec where import Prelude +import Control.Monad.Error.Class (liftEither, liftMaybe, throwError) import Control.Monad.Rec.Class (untilJust) import Control.Monad.ST.Class (liftST) +import Control.Monad.ST.Global as ST +import Control.Monad.ST.Ref as ST import Control.Monad.ST.Ref as ST.Ref import Data.Array as Array import Data.Either (Either(..)) -import Data.Maybe (Maybe(..), isJust) +import Data.Maybe (Maybe(..), isJust, maybe) import Data.Newtype (wrap) import Effect (Effect) -import Effect.Class (liftEffect) import Effect.Aff (Aff, launchAff_, delay, forkAff, joinFiber) +import Effect.Class (liftEffect) +import Effect.Console as Console +import Effect.Exception (error) import Effect.Exception as Error import Puppeteer (timeout) import Puppeteer as Pup import Puppeteer.Base (timeout') import Puppeteer.Browser as Pup.Browser +import Puppeteer.Eval as Pup.Eval import Puppeteer.HTTP.Request as Pup.HTTP.Request import Puppeteer.Page as Pup.Page import Puppeteer.Page.Event as Pup.Page.Event @@ -41,6 +47,15 @@ pageRequestsJs = """ +pageEmpty :: String +pageEmpty = + """ + + + + +""" + scriptUnblocks :: String scriptUnblocks = "window.unblock = true" @@ -142,3 +157,42 @@ spec = closeF <- forkAff $ Pup.Page.Event.once Pup.Page.Event.Close p Pup.Page.close p joinFiber closeF + + test "exclusive" \b -> do + msgST <- liftEffect $ ST.toEffect $ ST.new $ Right Nothing + p <- Pup.Page.new b + Pup.Page.setContent pageEmpty Pup.Load p + onceLog <- forkAff $ Pup.Page.Event.once Pup.Page.Event.Console p + exclusive <- liftEffect $ Pup.Page.Event.exclusive + Pup.Page.Event.Console + ( \m -> do + prev <- ST.toEffect $ ST.modify (const $ Right Nothing) msgST + case prev of + Right (Just _) -> void $ ST.toEffect $ ST.write (Left $ error $ "last message was not taken") msgST + Right Nothing -> void $ ST.toEffect $ ST.write (Right $ Just m) msgST + Left _ -> pure unit + ) + p + + Pup.Eval.unsafeRunJs0 @Unit "() => console.log('cheddar')" p + delay $ wrap 50.0 + + cheddarEM <- liftEffect $ ST.toEffect $ ST.read msgST + void $ liftEffect $ ST.toEffect $ ST.write (Right Nothing) msgST + cheddar <- liftMaybe (error "cheddar: listener did not fire") =<< liftEither cheddarEM + (ConsoleMessage.text cheddar) `shouldEqual` "cheddar" + + Pup.Eval.unsafeRunJs0 @Unit "() => console.log('brie')" p + brieEM <- liftEffect $ ST.toEffect $ ST.read msgST + void $ liftEffect $ ST.toEffect $ ST.write (Right Nothing) msgST + brie <- liftMaybe (error "brie: listener did not fire") =<< liftEither brieEM + (ConsoleMessage.text brie) `shouldEqual` "brie" + + Pup.closeContext exclusive + + Pup.Eval.unsafeRunJs0 @Unit "() => console.log('camembert')" p + camembertEM <- liftEffect $ ST.toEffect $ ST.read msgST + void $ liftEffect $ ST.toEffect $ ST.write (Right Nothing) msgST + maybe (pure unit) (const $ throwError $ error "camembert: listener wasn't removed") =<< liftEither camembertEM + camembertFromOnce <- joinFiber onceLog + (ConsoleMessage.text camembertFromOnce) `shouldEqual` "camembert"