parsek-cdp 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. parsek_cdp/__init__.py +55 -0
  2. parsek_cdp/_logging.py +49 -0
  3. parsek_cdp/cdp/__init__.py +247 -0
  4. parsek_cdp/cdp/accessibility/__init__.py +15 -0
  5. parsek_cdp/cdp/accessibility/events.py +35 -0
  6. parsek_cdp/cdp/accessibility/functions.py +202 -0
  7. parsek_cdp/cdp/accessibility/types.py +235 -0
  8. parsek_cdp/cdp/animation/__init__.py +15 -0
  9. parsek_cdp/cdp/animation/events.py +52 -0
  10. parsek_cdp/cdp/animation/functions.py +140 -0
  11. parsek_cdp/cdp/animation/types.py +113 -0
  12. parsek_cdp/cdp/audits/__init__.py +15 -0
  13. parsek_cdp/cdp/audits/events.py +21 -0
  14. parsek_cdp/cdp/audits/functions.py +95 -0
  15. parsek_cdp/cdp/audits/types.py +1051 -0
  16. parsek_cdp/cdp/autofill/__init__.py +15 -0
  17. parsek_cdp/cdp/autofill/events.py +27 -0
  18. parsek_cdp/cdp/autofill/functions.py +64 -0
  19. parsek_cdp/cdp/autofill/types.py +108 -0
  20. parsek_cdp/cdp/backgroundservice/__init__.py +15 -0
  21. parsek_cdp/cdp/backgroundservice/events.py +40 -0
  22. parsek_cdp/cdp/backgroundservice/functions.py +59 -0
  23. parsek_cdp/cdp/backgroundservice/types.py +63 -0
  24. parsek_cdp/cdp/bluetoothemulation/__init__.py +15 -0
  25. parsek_cdp/cdp/bluetoothemulation/events.py +70 -0
  26. parsek_cdp/cdp/bluetoothemulation/functions.py +247 -0
  27. parsek_cdp/cdp/bluetoothemulation/types.py +120 -0
  28. parsek_cdp/cdp/browser/__init__.py +15 -0
  29. parsek_cdp/cdp/browser/events.py +46 -0
  30. parsek_cdp/cdp/browser/functions.py +350 -0
  31. parsek_cdp/cdp/browser/types.py +158 -0
  32. parsek_cdp/cdp/cachestorage/__init__.py +15 -0
  33. parsek_cdp/cdp/cachestorage/events.py +13 -0
  34. parsek_cdp/cdp/cachestorage/functions.py +126 -0
  35. parsek_cdp/cdp/cachestorage/types.py +89 -0
  36. parsek_cdp/cdp/cast/__init__.py +15 -0
  37. parsek_cdp/cdp/cast/events.py +38 -0
  38. parsek_cdp/cdp/cast/functions.py +77 -0
  39. parsek_cdp/cdp/cast/types.py +23 -0
  40. parsek_cdp/cdp/console/__init__.py +15 -0
  41. parsek_cdp/cdp/console/events.py +22 -0
  42. parsek_cdp/cdp/console/functions.py +36 -0
  43. parsek_cdp/cdp/console/types.py +30 -0
  44. parsek_cdp/cdp/css/__init__.py +15 -0
  45. parsek_cdp/cdp/css/events.py +79 -0
  46. parsek_cdp/cdp/css/functions.py +788 -0
  47. parsek_cdp/cdp/css/types.py +742 -0
  48. parsek_cdp/cdp/debugger/__init__.py +15 -0
  49. parsek_cdp/cdp/debugger/events.py +164 -0
  50. parsek_cdp/cdp/debugger/functions.py +663 -0
  51. parsek_cdp/cdp/debugger/types.py +171 -0
  52. parsek_cdp/cdp/deviceaccess/__init__.py +15 -0
  53. parsek_cdp/cdp/deviceaccess/events.py +30 -0
  54. parsek_cdp/cdp/deviceaccess/functions.py +54 -0
  55. parsek_cdp/cdp/deviceaccess/types.py +28 -0
  56. parsek_cdp/cdp/deviceorientation/__init__.py +15 -0
  57. parsek_cdp/cdp/deviceorientation/events.py +13 -0
  58. parsek_cdp/cdp/deviceorientation/functions.py +35 -0
  59. parsek_cdp/cdp/deviceorientation/types.py +10 -0
  60. parsek_cdp/cdp/dom/__init__.py +15 -0
  61. parsek_cdp/cdp/dom/events.py +228 -0
  62. parsek_cdp/cdp/dom/functions.py +1033 -0
  63. parsek_cdp/cdp/dom/types.py +293 -0
  64. parsek_cdp/cdp/domdebugger/__init__.py +15 -0
  65. parsek_cdp/cdp/domdebugger/events.py +13 -0
  66. parsek_cdp/cdp/domdebugger/functions.py +155 -0
  67. parsek_cdp/cdp/domdebugger/types.py +57 -0
  68. parsek_cdp/cdp/domsnapshot/__init__.py +15 -0
  69. parsek_cdp/cdp/domsnapshot/events.py +13 -0
  70. parsek_cdp/cdp/domsnapshot/functions.py +111 -0
  71. parsek_cdp/cdp/domsnapshot/types.py +312 -0
  72. parsek_cdp/cdp/domstorage/__init__.py +15 -0
  73. parsek_cdp/cdp/domstorage/events.py +60 -0
  74. parsek_cdp/cdp/domstorage/functions.py +79 -0
  75. parsek_cdp/cdp/domstorage/types.py +30 -0
  76. parsek_cdp/cdp/emulation/__init__.py +15 -0
  77. parsek_cdp/cdp/emulation/events.py +17 -0
  78. parsek_cdp/cdp/emulation/functions.py +688 -0
  79. parsek_cdp/cdp/emulation/types.py +305 -0
  80. parsek_cdp/cdp/eventbreakpoints/__init__.py +15 -0
  81. parsek_cdp/cdp/eventbreakpoints/events.py +13 -0
  82. parsek_cdp/cdp/eventbreakpoints/functions.py +41 -0
  83. parsek_cdp/cdp/eventbreakpoints/types.py +10 -0
  84. parsek_cdp/cdp/extensions/__init__.py +15 -0
  85. parsek_cdp/cdp/extensions/events.py +13 -0
  86. parsek_cdp/cdp/extensions/functions.py +118 -0
  87. parsek_cdp/cdp/extensions/types.py +19 -0
  88. parsek_cdp/cdp/fedcm/__init__.py +15 -0
  89. parsek_cdp/cdp/fedcm/events.py +45 -0
  90. parsek_cdp/cdp/fedcm/functions.py +93 -0
  91. parsek_cdp/cdp/fedcm/types.py +72 -0
  92. parsek_cdp/cdp/fetch/__init__.py +15 -0
  93. parsek_cdp/cdp/fetch/events.py +82 -0
  94. parsek_cdp/cdp/fetch/functions.py +215 -0
  95. parsek_cdp/cdp/fetch/types.py +81 -0
  96. parsek_cdp/cdp/filesystem/__init__.py +15 -0
  97. parsek_cdp/cdp/filesystem/events.py +13 -0
  98. parsek_cdp/cdp/filesystem/functions.py +36 -0
  99. parsek_cdp/cdp/filesystem/types.py +54 -0
  100. parsek_cdp/cdp/headlessexperimental/__init__.py +15 -0
  101. parsek_cdp/cdp/headlessexperimental/events.py +13 -0
  102. parsek_cdp/cdp/headlessexperimental/functions.py +77 -0
  103. parsek_cdp/cdp/headlessexperimental/types.py +24 -0
  104. parsek_cdp/cdp/heapprofiler/__init__.py +15 -0
  105. parsek_cdp/cdp/heapprofiler/events.py +65 -0
  106. parsek_cdp/cdp/heapprofiler/functions.py +193 -0
  107. parsek_cdp/cdp/heapprofiler/types.py +57 -0
  108. parsek_cdp/cdp/indexeddb/__init__.py +15 -0
  109. parsek_cdp/cdp/indexeddb/events.py +13 -0
  110. parsek_cdp/cdp/indexeddb/functions.py +232 -0
  111. parsek_cdp/cdp/indexeddb/types.py +120 -0
  112. parsek_cdp/cdp/input/__init__.py +15 -0
  113. parsek_cdp/cdp/input/events.py +25 -0
  114. parsek_cdp/cdp/input/functions.py +361 -0
  115. parsek_cdp/cdp/input/types.py +87 -0
  116. parsek_cdp/cdp/inspector/__init__.py +15 -0
  117. parsek_cdp/cdp/inspector/events.py +41 -0
  118. parsek_cdp/cdp/inspector/functions.py +27 -0
  119. parsek_cdp/cdp/inspector/types.py +10 -0
  120. parsek_cdp/cdp/io/__init__.py +15 -0
  121. parsek_cdp/cdp/io/events.py +13 -0
  122. parsek_cdp/cdp/io/functions.py +77 -0
  123. parsek_cdp/cdp/io/types.py +13 -0
  124. parsek_cdp/cdp/layertree/__init__.py +15 -0
  125. parsek_cdp/cdp/layertree/events.py +36 -0
  126. parsek_cdp/cdp/layertree/functions.py +178 -0
  127. parsek_cdp/cdp/layertree/types.py +104 -0
  128. parsek_cdp/cdp/log/__init__.py +15 -0
  129. parsek_cdp/cdp/log/events.py +22 -0
  130. parsek_cdp/cdp/log/functions.py +54 -0
  131. parsek_cdp/cdp/log/types.py +57 -0
  132. parsek_cdp/cdp/media/__init__.py +15 -0
  133. parsek_cdp/cdp/media/events.py +87 -0
  134. parsek_cdp/cdp/media/functions.py +27 -0
  135. parsek_cdp/cdp/media/types.py +101 -0
  136. parsek_cdp/cdp/memory/__init__.py +15 -0
  137. parsek_cdp/cdp/memory/events.py +13 -0
  138. parsek_cdp/cdp/memory/functions.py +164 -0
  139. parsek_cdp/cdp/memory/types.py +71 -0
  140. parsek_cdp/cdp/mixins/__init__.py +21 -0
  141. parsek_cdp/cdp/mixins/datatype.py +123 -0
  142. parsek_cdp/cdp/mixins/event.py +78 -0
  143. parsek_cdp/cdp/mixins/namespace.py +31 -0
  144. parsek_cdp/cdp/network/__init__.py +15 -0
  145. parsek_cdp/cdp/network/events.py +726 -0
  146. parsek_cdp/cdp/network/functions.py +734 -0
  147. parsek_cdp/cdp/network/types.py +1247 -0
  148. parsek_cdp/cdp/overlay/__init__.py +15 -0
  149. parsek_cdp/cdp/overlay/events.py +54 -0
  150. parsek_cdp/cdp/overlay/functions.py +407 -0
  151. parsek_cdp/cdp/overlay/types.py +328 -0
  152. parsek_cdp/cdp/page/__init__.py +15 -0
  153. parsek_cdp/cdp/page/events.py +416 -0
  154. parsek_cdp/cdp/page/functions.py +1081 -0
  155. parsek_cdp/cdp/page/types.py +1088 -0
  156. parsek_cdp/cdp/performance/__init__.py +15 -0
  157. parsek_cdp/cdp/performance/events.py +24 -0
  158. parsek_cdp/cdp/performance/functions.py +63 -0
  159. parsek_cdp/cdp/performance/types.py +22 -0
  160. parsek_cdp/cdp/performancetimeline/__init__.py +15 -0
  161. parsek_cdp/cdp/performancetimeline/events.py +22 -0
  162. parsek_cdp/cdp/performancetimeline/functions.py +30 -0
  163. parsek_cdp/cdp/performancetimeline/types.py +85 -0
  164. parsek_cdp/cdp/preload/__init__.py +15 -0
  165. parsek_cdp/cdp/preload/events.py +116 -0
  166. parsek_cdp/cdp/preload/functions.py +25 -0
  167. parsek_cdp/cdp/preload/types.py +267 -0
  168. parsek_cdp/cdp/profiler/__init__.py +15 -0
  169. parsek_cdp/cdp/profiler/events.py +64 -0
  170. parsek_cdp/cdp/profiler/functions.py +134 -0
  171. parsek_cdp/cdp/profiler/types.py +105 -0
  172. parsek_cdp/cdp/pwa/__init__.py +15 -0
  173. parsek_cdp/cdp/pwa/events.py +13 -0
  174. parsek_cdp/cdp/pwa/functions.py +196 -0
  175. parsek_cdp/cdp/pwa/types.py +45 -0
  176. parsek_cdp/cdp/runtime/__init__.py +15 -0
  177. parsek_cdp/cdp/runtime/events.py +123 -0
  178. parsek_cdp/cdp/runtime/functions.py +552 -0
  179. parsek_cdp/cdp/runtime/types.py +319 -0
  180. parsek_cdp/cdp/schema/__init__.py +15 -0
  181. parsek_cdp/cdp/schema/events.py +13 -0
  182. parsek_cdp/cdp/schema/functions.py +32 -0
  183. parsek_cdp/cdp/schema/types.py +22 -0
  184. parsek_cdp/cdp/security/__init__.py +15 -0
  185. parsek_cdp/cdp/security/events.py +64 -0
  186. parsek_cdp/cdp/security/functions.py +66 -0
  187. parsek_cdp/cdp/security/types.py +168 -0
  188. parsek_cdp/cdp/serviceworker/__init__.py +15 -0
  189. parsek_cdp/cdp/serviceworker/events.py +43 -0
  190. parsek_cdp/cdp/serviceworker/functions.py +115 -0
  191. parsek_cdp/cdp/serviceworker/types.py +95 -0
  192. parsek_cdp/cdp/storage/__init__.py +15 -0
  193. parsek_cdp/cdp/storage/events.py +288 -0
  194. parsek_cdp/cdp/storage/functions.py +571 -0
  195. parsek_cdp/cdp/storage/types.py +656 -0
  196. parsek_cdp/cdp/systeminfo/__init__.py +15 -0
  197. parsek_cdp/cdp/systeminfo/events.py +13 -0
  198. parsek_cdp/cdp/systeminfo/functions.py +75 -0
  199. parsek_cdp/cdp/systeminfo/types.py +132 -0
  200. parsek_cdp/cdp/target/__init__.py +15 -0
  201. parsek_cdp/cdp/target/events.py +109 -0
  202. parsek_cdp/cdp/target/functions.py +424 -0
  203. parsek_cdp/cdp/target/types.py +83 -0
  204. parsek_cdp/cdp/tethering/__init__.py +15 -0
  205. parsek_cdp/cdp/tethering/events.py +22 -0
  206. parsek_cdp/cdp/tethering/functions.py +35 -0
  207. parsek_cdp/cdp/tethering/types.py +10 -0
  208. parsek_cdp/cdp/tracing/__init__.py +15 -0
  209. parsek_cdp/cdp/tracing/events.py +61 -0
  210. parsek_cdp/cdp/tracing/functions.py +119 -0
  211. parsek_cdp/cdp/tracing/types.py +81 -0
  212. parsek_cdp/cdp/webaudio/__init__.py +15 -0
  213. parsek_cdp/cdp/webaudio/events.py +184 -0
  214. parsek_cdp/cdp/webaudio/functions.py +51 -0
  215. parsek_cdp/cdp/webaudio/types.py +155 -0
  216. parsek_cdp/cdp/webauthn/__init__.py +15 -0
  217. parsek_cdp/cdp/webauthn/events.py +69 -0
  218. parsek_cdp/cdp/webauthn/functions.py +214 -0
  219. parsek_cdp/cdp/webauthn/types.py +96 -0
  220. parsek_cdp/core/__init__.py +18 -0
  221. parsek_cdp/core/browser.py +240 -0
  222. parsek_cdp/core/browser_context.py +58 -0
  223. parsek_cdp/core/element.py +405 -0
  224. parsek_cdp/core/feature.py +376 -0
  225. parsek_cdp/core/frame.py +351 -0
  226. parsek_cdp/core/pagable.py +175 -0
  227. parsek_cdp/core/page.py +163 -0
  228. parsek_cdp/core/target.py +490 -0
  229. parsek_cdp/features/__init__.py +14 -0
  230. parsek_cdp/features/request_listener/__init__.py +256 -0
  231. parsek_cdp/features/request_listener/events.py +48 -0
  232. parsek_cdp/features/request_listener/types.py +235 -0
  233. parsek_cdp/generate.py +642 -0
  234. parsek_cdp/parsek/__init__.py +18 -0
  235. parsek_cdp/parsek/events.py +38 -0
  236. parsek_cdp/parsek/types.py +36 -0
  237. parsek_cdp/py.typed +0 -0
  238. parsek_cdp-0.1.0.dist-info/METADATA +277 -0
  239. parsek_cdp-0.1.0.dist-info/RECORD +242 -0
  240. parsek_cdp-0.1.0.dist-info/WHEEL +5 -0
  241. parsek_cdp-0.1.0.dist-info/licenses/LICENSE +201 -0
  242. parsek_cdp-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,36 @@
1
+ """Wire types of the Parsek contract -- the protocol *between* client and server.
2
+
3
+ This is deliberately tiny: browser *control* goes over plain CDP (the server is
4
+ a transparent proxy), so the only thing that needs its own contract is what CDP
5
+ cannot express -- the **lifecycle** of a server-supervised browser. These types
6
+ are shipped in the client distribution and reused by the server, built on the
7
+ same :class:`~parsek_cdp.cdp.mixins.datatype` machinery as the generated CDP
8
+ types so they (de)serialize identically.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ from enum import Enum
14
+
15
+ from ..cdp.mixins.datatype import register
16
+
17
+
18
+ class BrowserState(str, Enum):
19
+ """Lifecycle state of a supervised browser.
20
+
21
+ Broadcast to control-channel clients as
22
+ :class:`~parsek_cdp.parsek.events.BrowserStateChanged` so a parser can react
23
+ (re-attach, re-navigate) instead of hanging on a dead socket. ``str`` mixin
24
+ so the value serializes directly to JSON.
25
+ """
26
+
27
+ STARTING = "starting"
28
+ READY = "ready"
29
+ CRASHED = "crashed"
30
+ RESTARTING = "restarting"
31
+ CLOSED = "closed"
32
+
33
+
34
+ # Referenced by ``ref`` from the event field below, so it must be resolvable in
35
+ # the TYPE_REGISTRY.
36
+ register("Parsek.BrowserState")(BrowserState)
parsek_cdp/py.typed ADDED
File without changes
@@ -0,0 +1,277 @@
1
+ Metadata-Version: 2.4
2
+ Name: parsek-cdp
3
+ Version: 0.1.0
4
+ Summary: Chrome DevTools Protocol client — generated protocol layer + async runtime (client scope).
5
+ Author: xa1era
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Repository, https://github.com/xa1era/parsek-cdp
8
+ Requires-Python: >=3.13
9
+ Description-Content-Type: text/markdown
10
+ License-File: LICENSE
11
+ Requires-Dist: websockets>=12
12
+ Provides-Extra: server
13
+ Requires-Dist: parsek-cdp-server~=0.1.0; extra == "server"
14
+ Dynamic: license-file
15
+
16
+ # parsek-cdp
17
+
18
+ An async [Chrome DevTools Protocol](https://chromedevtools.github.io/devtools-protocol/)
19
+ client for driving Chromium-based browsers from Python.
20
+
21
+ The protocol layer (`cdp/`) is **fully generated** from the official
22
+ [devtools-protocol](https://github.com/ChromeDevTools/devtools-protocol) JSON
23
+ definitions — one typed module per domain. The runtime (`core/`) is
24
+ hand-written: one websocket per target, typed command calls, event handlers and
25
+ an opt-in feature system. No `sessionId` multiplexing — every target (browser,
26
+ page, worker, OOPIF) gets its own connection.
27
+
28
+ Requires **Python 3.12+** (the API uses PEP 695 generics) and a running
29
+ Chromium/Chrome with remote debugging enabled.
30
+
31
+ ```bash
32
+ pip install parsek-cdp
33
+ ```
34
+
35
+ > Документация на русском: [README.ru.md](README.ru.md).
36
+
37
+ ## Quickstart
38
+
39
+ Start a browser with remote debugging:
40
+
41
+ ```bash
42
+ chromium --headless=new --remote-debugging-port=9222
43
+ ```
44
+
45
+ Then drive it:
46
+
47
+ ```python
48
+ import asyncio
49
+ from parsek_cdp import Browser, Page, RequestListener
50
+
51
+
52
+ async def main():
53
+ # `page_class` types every page in this browser as Page[RequestListener].
54
+ browser = await Browser.connect_http(
55
+ "http://127.0.0.1:9222", page_class=Page[RequestListener]
56
+ )
57
+
58
+ page = await browser.new_page()
59
+ requests = page.get_feature(RequestListener)
60
+
61
+ await page.navigate("https://example.com", wait_load=True)
62
+
63
+ for r in requests.requests:
64
+ status = r.response.status_code if r.response else "(pending)"
65
+ print(r.method, r.url, "->", status)
66
+
67
+ await browser.close()
68
+
69
+
70
+ asyncio.run(main())
71
+ ```
72
+
73
+ ## Concepts
74
+
75
+ ### Targets and connections
76
+
77
+ A `Target` *is* a single CDP session on its own websocket. `Browser`, `Page`,
78
+ workers and out-of-process iframes are all targets. The DevTools host is bound
79
+ once (in a `contextvar`) when the browser is reached, so it is not threaded
80
+ through every call.
81
+
82
+ The full command surface is reached through `target.cdp`, one attribute per CDP
83
+ domain, with typed methods and results:
84
+
85
+ ```python
86
+ await page.cdp.Network.enable()
87
+ info = await page.cdp.Target.get_target_info()
88
+ ```
89
+
90
+ Domains enable/disable themselves on use, and `domain_enabled` scopes a domain
91
+ to a block:
92
+
93
+ ```python
94
+ async with page.domain_enabled(page.cdp.Page):
95
+ await page.cdp.Page.navigate(url="https://example.com")
96
+ ```
97
+
98
+ ### Events
99
+
100
+ Register handlers on a specific target, or globally on the event class:
101
+
102
+ ```python
103
+ from parsek_cdp.cdp import Network
104
+
105
+ # per-target
106
+ page.on(Network.RequestWillBeSent, lambda e: print(e.request.url))
107
+
108
+ # globally, for every target
109
+ @Network.RequestWillBeSent.add_handler
110
+ async def on_request(e):
111
+ print(e.request.url)
112
+
113
+ # await a single event
114
+ loaded = await page.wait_for(Network.ResponseReceived, timeout=10)
115
+ ```
116
+
117
+ Handlers may be sync or async; one failing handler never tears down the
118
+ connection or stops the others.
119
+
120
+ ### Pages, frames and elements
121
+
122
+ A `Page` *is its own main frame*, so frame methods work on the top frame
123
+ directly:
124
+
125
+ ```python
126
+ el = await page.select(selector="h1") # query the main frame
127
+ print(el.text)
128
+ await el.fill("hello")
129
+ await el.mouse_click()
130
+
131
+ title = await page.evaluate("document.title")
132
+ ```
133
+
134
+ The full frame tree (subframes, cross-origin OOPIFs — each transparently routed
135
+ through its own session) lives on `page.frames`. `page.with_same_navigation()`
136
+ guards a block against a main-frame navigation cutting it short.
137
+
138
+ ### Browser contexts
139
+
140
+ Pages are grouped into browser contexts (incognito-like profiles). The default
141
+ context holds pages created without an explicit one:
142
+
143
+ ```python
144
+ context = await browser.create_context() # isolated profile
145
+ page = await context.new_page("https://example.com")
146
+ ```
147
+
148
+ ## Features
149
+
150
+ A `Page` attaches **no** behaviour by default. A *feature* is a unit of
151
+ behaviour you opt into, either declaratively or imperatively:
152
+
153
+ ```python
154
+ from parsek_cdp import Page, RequestListener
155
+
156
+ Page[RequestListener] # declarative — typed page class
157
+ page.get_feature(RequestListener) # imperative — attached on first use, typed
158
+ ```
159
+
160
+ The key idea: a feature is written **once** and runs in three roles —
161
+
162
+ - **local** — direct to the browser: the producers subscribe to raw CDP on the
163
+ page and reduce it in-process (a plain local `Page`);
164
+ - **server** — the proxy feeds raw CDP to the producers, whose output is emitted
165
+ to the client as a `Parsek.*` event *and* reduced locally for snapshots;
166
+ - **client** — only the reducers run, fed by those `Parsek.*` events off the wire.
167
+
168
+ Conceptually that is two *sides* — a *producer* of `Parsek.*` events and a *view*
169
+ of them — but the producer side exists both in-process (`local`) and over the
170
+ wire (`server`). The reducers run in every role, so the feature's public API is
171
+ identical whether the browser is local or behind a `parsek-cdp-server` proxy.
172
+
173
+ ### Writing a custom feature — domain-like structure
174
+
175
+ A feature mirrors the layout of a generated CDP domain (`cdp/<domain>/` =
176
+ *types · functions · events*). Give it its own package with the same three
177
+ files, so the feature class doubles as its own namespace:
178
+
179
+ ```
180
+ features/<feature>/
181
+ types.py # wire dataclasses + view types (@parsek_type)
182
+ events.py # aggregated Parsek.* events (@register_event)
183
+ __init__.py # the Feature class itself: domains + @on/@emit handlers
184
+ ```
185
+
186
+ The building blocks (all from `parsek_cdp.core.feature`):
187
+
188
+ | Block | Where | What |
189
+ | --- | --- | --- |
190
+ | `domains = (Network, ...)` | feature class | CDP domains the feature owns — auto-enabled, and their raw events are suppressed from client passthrough |
191
+ | `@on(Event)` | method | register a handler. A **CDP** event makes it a *producer* (runs server/local); a **`Parsek.*`** event makes it a *reducer* (runs in every role) |
192
+ | `@emit(ParsekEvent)` | producer method | its return value is published to the client **and** reduced locally — so state is built by the same code path everywhere |
193
+ | `@parsek_type("Parsek.<Feature>.<Type>")` | `types.py` | declare a wire dataclass; `__FIELDS__` are derived from annotations (snake_case ↔ camelCase) |
194
+ | `@register_event("Parsek.<Feature>.<event>")` | `events.py` | declare an aggregated event class |
195
+ | `snapshot()` | feature class | state handed to a late-joining client (the server may replay it on connect) |
196
+ | `attach_namespace(Feat, types, events)` | end of `__init__.py` | expose the types/events as attributes on the feature class (`Feat.RequestData`, `Feat.RequestSent`, ...) |
197
+
198
+ Sketch — a producer that folds a raw CDP burst into one `Parsek.*` event, plus
199
+ the reducer that rebuilds state from it:
200
+
201
+ ```python
202
+ # events.py
203
+ @register_event("Parsek.MyFeature.thing")
204
+ @dataclass
205
+ class ThingHappened(Event):
206
+ payload: ThingData
207
+ __FIELDS__ = (FieldMeta("payload", "payload", False, "object",
208
+ ref="Parsek.MyFeature.ThingData"),)
209
+
210
+ # __init__.py
211
+ class MyFeature(Feature):
212
+ domains = (SomeDomain,) # owned + auto-enabled
213
+
214
+ @on(SomeDomain.SomethingRaw) # CDP event -> producer
215
+ @emit(ThingHappened) # return is sent to client + reduced
216
+ def _produce(self, e) -> ThingHappened:
217
+ return ThingHappened(payload=ThingData(...))
218
+
219
+ @on(ThingHappened) # Parsek event -> reducer (both roles)
220
+ def _reduce(self, e: ThingHappened) -> None:
221
+ self._things.append(e.payload)
222
+
223
+ @property
224
+ def things(self): # the ergonomic public API
225
+ return list(self._things)
226
+
227
+ attach_namespace(MyFeature, _types, _events)
228
+ ```
229
+
230
+ `RequestListener` (below) is the reference implementation of exactly this shape.
231
+
232
+ ### `RequestListener`
233
+
234
+ The built-in feature: aggregated network observation. It records every request
235
+ of the current document with its response, headers and timing:
236
+
237
+ ```python
238
+ requests = page.get_feature(RequestListener)
239
+ await page.navigate("https://example.com", wait_load=True)
240
+
241
+ # all requests of the current document
242
+ for r in requests.requests:
243
+ print(r.method, r.url, r.response.status_code)
244
+
245
+ # find / await a specific one (substring or compiled regex against the URL)
246
+ r = await requests.wait_for_response("/api/orders", timeout=30, load_body=True)
247
+ print(r.response.status_code, await r.response.body())
248
+ ```
249
+
250
+ By default the log is cleared on main-frame navigation (like DevTools with
251
+ *Preserve log* off); pass `preserve_log=True` to keep it across documents.
252
+
253
+ ## Remote browsers (with `parsek-cdp-server`)
254
+
255
+ Install the optional server distribution to launch and supervise browsers
256
+ behind a proxy:
257
+
258
+ ```bash
259
+ pip install parsek-cdp[server]
260
+ ```
261
+
262
+ Then connect to a running server instead of a local Chrome — the API is
263
+ identical, and the declared features are aggregated server-side:
264
+
265
+ ```python
266
+ browser = await Browser[Page[RequestListener]].get_distant_browser(
267
+ "http://127.0.0.1:9333", headless=True
268
+ )
269
+ page = await browser.new_page("https://example.com")
270
+ ```
271
+
272
+ See the [`parsek-cdp-server`](https://github.com/xa1era/parsek-cdp) package for
273
+ running the server, lifecycle supervision, metrics and the zombie reaper.
274
+
275
+ ## License
276
+
277
+ Apache-2.0.
@@ -0,0 +1,242 @@
1
+ parsek_cdp/__init__.py,sha256=BXbo7nl5nF5Uoq6ZCu0OKHR0exs_MNtlpQG0lhsAzmQ,1357
2
+ parsek_cdp/_logging.py,sha256=gXoB_r4gfKXQxC68dtXBlps09p_F0bHq3HccZJpZ6-0,1732
3
+ parsek_cdp/generate.py,sha256=s9-APpBpFpqEQOcjY_qWIaoRieDpAlrsKMSBEUTt2zw,22431
4
+ parsek_cdp/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
+ parsek_cdp/cdp/__init__.py,sha256=hFgKAiZv6s09Wd4tKRza_aUJzbkgAl_cDFh4wH5g9r4,8890
6
+ parsek_cdp/cdp/accessibility/__init__.py,sha256=Qy0AnD0jiTJB9V8KIIP87r0DlygXwJpisJzX1YKRZFE,694
7
+ parsek_cdp/cdp/accessibility/events.py,sha256=gG_w-KLS9n_jZYY16M-fOlhGjBVljCySydXrIOzgB3M,1154
8
+ parsek_cdp/cdp/accessibility/functions.py,sha256=8--Ymu0JsLLpJgeI0JZQpSCpWtIQ2WkXHV8aPvM92Bs,10136
9
+ parsek_cdp/cdp/accessibility/types.py,sha256=fB4ODw7zkF2okfkaAyOmobhU2QP8txAuhV15qKRi23c,9027
10
+ parsek_cdp/cdp/animation/__init__.py,sha256=i5G_XvWW7y70soLOSrKjVDdm1kUPNvsy_ad0LSlMsmg,658
11
+ parsek_cdp/cdp/animation/events.py,sha256=ReSERGcnOzuNGJAGA8FdKUTa3zUGZicafKbB6V0qjq4,1540
12
+ parsek_cdp/cdp/animation/functions.py,sha256=qJKTUmZDfoWZunnVZfJKRLwTQ8R6s1eiaQqKzYNkw64,5890
13
+ parsek_cdp/cdp/animation/types.py,sha256=KG9hqgsj2Fa358vUwQPyF_i7pOp-ySfybMxk_LKQeeY,4395
14
+ parsek_cdp/cdp/audits/__init__.py,sha256=QjwASJmppnx-pqtJ5_0QItm7sRbkz_k1JHkTNbSknk8,631
15
+ parsek_cdp/cdp/audits/events.py,sha256=DiRVC8cE5AsxoH_MM2JwSFAJo0_9VEDGuJL7egSziM4,595
16
+ parsek_cdp/cdp/audits/functions.py,sha256=Sr84CS4h8lg97okNEvG8m5lg94yoxwyl1ssw1rflm9w,4084
17
+ parsek_cdp/cdp/audits/types.py,sha256=mMjt_hbaZJw6z1ioX6YQzhQnhR5zXHNp2MdM2idvOpY,52030
18
+ parsek_cdp/cdp/autofill/__init__.py,sha256=7-O1DpbSq7t6kqD2NJDeWVXlV0Na50V5EaMXxvZL0Gw,649
19
+ parsek_cdp/cdp/autofill/events.py,sha256=LTXUtFcja7pt9Nkucb55S5BFmFhNa5rILRkU4ha1EzM,884
20
+ parsek_cdp/cdp/autofill/functions.py,sha256=m-3LL0F5YhrhXUx6oVbBTQpBGeV3_vZ6P8xPfnjP82c,2897
21
+ parsek_cdp/cdp/autofill/types.py,sha256=oFMPCeCFm2-J4eHwuLW3q7Ubhh8hIHSUZO2MpdiSDrE,3821
22
+ parsek_cdp/cdp/backgroundservice/__init__.py,sha256=zzO67Zz0Mpxfvchy_1MCnHR4Qx7M2515AZmEeI7-goU,730
23
+ parsek_cdp/cdp/backgroundservice/events.py,sha256=-u78ox6MIK0cHghyKSrlD8ajgiknjfCT-ZcSboVqHm4,1410
24
+ parsek_cdp/cdp/backgroundservice/functions.py,sha256=fRo7KyeYk9xGtO18E7Yu8efZhwzHDVmwLKpb5i0_2dA,2339
25
+ parsek_cdp/cdp/backgroundservice/types.py,sha256=p0l7hU9xM-n3TqYyY5LKFOoNA_uvbYCRwk-3--R5Oow,2462
26
+ parsek_cdp/cdp/bluetoothemulation/__init__.py,sha256=59dxQBOdTbmzqPaz_iJ16mZaNeMWirDOLosv68S_ppE,739
27
+ parsek_cdp/cdp/bluetoothemulation/events.py,sha256=_NBqI8gwavmb09pp-0PvccC8uJH-uxPntaiVs54_rok,2594
28
+ parsek_cdp/cdp/bluetoothemulation/functions.py,sha256=TFfFSrnjGFDfuT0W89FtfsakJhdZ5zGfIdYD-aAV0Ro,11701
29
+ parsek_cdp/cdp/bluetoothemulation/types.py,sha256=DIx_OHl1BCXkzu5ba9Ad5V-3fciSbFKJ24J1p5SEYtc,4668
30
+ parsek_cdp/cdp/browser/__init__.py,sha256=0i1PP53SiR-ocyNcM_DYAB0idH43F0yX_ZexzBLvNIE,640
31
+ parsek_cdp/cdp/browser/events.py,sha256=FgSP5mYvZ9tMqXtqJoS5Z3O4Vdrcd0Oq8I_09kDVIsk,1614
32
+ parsek_cdp/cdp/browser/functions.py,sha256=lqQIvIqE1k2dw6LFLqlWY6TZkILdw-xTYhRlkvSIwBk,17134
33
+ parsek_cdp/cdp/browser/types.py,sha256=P8qENIWQjKD83O-kLv-Ohm8xHbXzUoSO-J695qU2Rq0,5186
34
+ parsek_cdp/cdp/cachestorage/__init__.py,sha256=1xK-vgogztFqJTTMSCiikNQl-vF7LURaTo651bcoB-o,685
35
+ parsek_cdp/cdp/cachestorage/events.py,sha256=T5zhvpTtKQzkHYBqM4eH1z1WO0RhoorHTN9wc-bnCVU,327
36
+ parsek_cdp/cdp/cachestorage/functions.py,sha256=ByRpdO7jsildCSPWdOSuzF1846FLx1ttfmzwAYX77m0,5842
37
+ parsek_cdp/cdp/cachestorage/types.py,sha256=aEiJFceIvFnF2RuJ_uIkOUPmRukDIfqGszYEr8RMca4,3099
38
+ parsek_cdp/cdp/cast/__init__.py,sha256=Xn7daQVl5WM8eEfvfFctBKdo2SL4OJdOI4oznrgZKow,613
39
+ parsek_cdp/cdp/cast/events.py,sha256=3YcW1u5JVnfVMKcn0MKaoHLnIuM-zqFTQFT4nhyf9HI,1127
40
+ parsek_cdp/cdp/cast/functions.py,sha256=CMT9G13y1BJO8p2wKcW1ZpwtnJs8tHLHsA0VzyAYnyI,2984
41
+ parsek_cdp/cdp/cast/types.py,sha256=W5KsXo-YkYY3QsABiB1jqFzwPZp-LTD_YbmyqF2tNAw,625
42
+ parsek_cdp/cdp/console/__init__.py,sha256=tSSgtA4IdbcoaYJFbhUr45NN_ZiEeh1jZhPRrab11rc,640
43
+ parsek_cdp/cdp/console/events.py,sha256=9yCriyW3Ss2zgO21Jl1RHomrjMCiyT7pqkrXXNNrzlA,662
44
+ parsek_cdp/cdp/console/functions.py,sha256=WaGsP0umgo8Ms1K5M1UJvBAUlVsG0e6lUr4CVEydXR8,1200
45
+ parsek_cdp/cdp/console/types.py,sha256=X2gbL4PTzPs9MrzWXeIlrvzTw7-o6sgd1_GFQFEyui4,1117
46
+ parsek_cdp/cdp/css/__init__.py,sha256=JTz_7FUgWALhZ9qlw9Y00IIMy086cGdp2vNjbO8ur3E,604
47
+ parsek_cdp/cdp/css/events.py,sha256=oI9pFeS-9D--6yYJq6cunhApWJFV9fLI9GDtFQLPICg,2477
48
+ parsek_cdp/cdp/css/functions.py,sha256=C5sJDo9c1sEmsaUhFBJvaazkymOPIjyGyT4wy9h_Nzc,37939
49
+ parsek_cdp/cdp/css/types.py,sha256=OfcXIOeVH6cL2D752AYZ2Tko8va1ReNxYXR-8HeIqp4,29573
50
+ parsek_cdp/cdp/debugger/__init__.py,sha256=5cCqoMfJOlO1-gUZlLuxeGnwz-saY-vkkmYB6O8KSgo,649
51
+ parsek_cdp/cdp/debugger/events.py,sha256=DPdko6o6fuXXtfoBpJMAxMQDWosg_RFgv5Ti5jbioMs,7691
52
+ parsek_cdp/cdp/debugger/functions.py,sha256=cuokU6suQP-QRL9ojs9D1Cj9vg9bwxe2wepTySZePaw,35256
53
+ parsek_cdp/cdp/debugger/types.py,sha256=iqeUDaSrV_CsHHInwYHVwWzDuVkcYesEyVq5i9kBObs,6308
54
+ parsek_cdp/cdp/deviceaccess/__init__.py,sha256=yCPKGk10O88cuazUBWPP7ZKaRZjhUXDXRa1w6aqwVpY,685
55
+ parsek_cdp/cdp/deviceaccess/events.py,sha256=aBrmknNXb6yakxHde43K4f2DsIuqw-5Tg9vBVghFe94,935
56
+ parsek_cdp/cdp/deviceaccess/functions.py,sha256=E0Xh7EjWU7-bcrp1L3767Lv8NOGAIlxzWMigblJLlKg,1874
57
+ parsek_cdp/cdp/deviceaccess/types.py,sha256=2uTv_B3yr6c5wG95EbfbL7FrNbtBhZv230Lfo3sfEhI,760
58
+ parsek_cdp/cdp/deviceorientation/__init__.py,sha256=dIOYM9m01c1oW3AAtFM22-t9U1qCXv49fnPg11G4_bI,730
59
+ parsek_cdp/cdp/deviceorientation/events.py,sha256=qXAQS4ctI3ca9MNZkwYshjgQwBgzefzulSAkSDj7MQY,332
60
+ parsek_cdp/cdp/deviceorientation/functions.py,sha256=azjnK9Eok89wuvv_mlPc3xwk-D_rBZRFE7ivcvBTcmM,1374
61
+ parsek_cdp/cdp/deviceorientation/types.py,sha256=yn4v4W7brplYVuZtsMkQJ226w-9-_1gUwxpIb9uIKak,306
62
+ parsek_cdp/cdp/dom/__init__.py,sha256=3EEhR0TF0875ZeI0pkymOD8s3V5Cx308iBBfl1uEbd4,604
63
+ parsek_cdp/cdp/dom/events.py,sha256=MJOydh4klQ3bsChcqh3yKVPUlr9aaKDiXV_rLKWfhqI,7625
64
+ parsek_cdp/cdp/dom/functions.py,sha256=xMSi7HO_nCf7zKZ_6NXCOq1xn6TcNdKCGHGZeXUy66U,49201
65
+ parsek_cdp/cdp/dom/types.py,sha256=-6BUw2NdM7kcj-oeVUVlOumbS2FzLgEKKDgWoKciGPE,11402
66
+ parsek_cdp/cdp/domdebugger/__init__.py,sha256=wi1y08aQr5pdgnczon-AvisY_AxCpyNUGiwH4t-HBdI,676
67
+ parsek_cdp/cdp/domdebugger/events.py,sha256=9_auhMejyO3psRtdXz1JzF6AijUMNjLHbhpwAnTVxx4,326
68
+ parsek_cdp/cdp/domdebugger/functions.py,sha256=TRcGJ1k94vd9bb2mi4bSlTT9UCK8QtiStGmpCWPoKKE,7338
69
+ parsek_cdp/cdp/domdebugger/types.py,sha256=xysrTfw8x3re86ja2hGP58AdpXkgl-WP3_Jfs25ZJvQ,2229
70
+ parsek_cdp/cdp/domsnapshot/__init__.py,sha256=wr-iSHvUrIT9S6qU-gDgHjxhimAPOGIbR_xHccNYAPM,676
71
+ parsek_cdp/cdp/domsnapshot/events.py,sha256=STu0h1Mn__7x7si3nEg6oYO2SnvnkmXCzXsdAuxqz4I,326
72
+ parsek_cdp/cdp/domsnapshot/functions.py,sha256=K21Gs6_9JUrq-WZfCXrGx38gpc4vu9jD23TOAQA_pTM,6560
73
+ parsek_cdp/cdp/domsnapshot/types.py,sha256=Qe010s142Jldu7-7rT9zpYIl5xiEyqOpaLu-cLbhK-Y,15657
74
+ parsek_cdp/cdp/domstorage/__init__.py,sha256=CAYc1jB-qTxikjmN58aOsHOhIX9RK1yaF-e8cuWZHiw,667
75
+ parsek_cdp/cdp/domstorage/events.py,sha256=BJgoYa4MTguItaWuJ9fQv5SOTt1aIQdVCGyq_MoxY_k,1938
76
+ parsek_cdp/cdp/domstorage/functions.py,sha256=w3TZyttmlsoLgQfozGJFOvc03zV2YXyqaZb7RjmFZgw,3217
77
+ parsek_cdp/cdp/domstorage/types.py,sha256=F2ow2FFmQxOVmNbAiVN7F5HYexCGfSL4Ep8wbnEhAaI,914
78
+ parsek_cdp/cdp/emulation/__init__.py,sha256=2pjrB916ncyfzozqRcP_wjMAd1qRlIXO278rHsA0UJE,658
79
+ parsek_cdp/cdp/emulation/events.py,sha256=aBJh1A64UCPZwbxbrZC8rh5SVmi5NHZeo0R1EnpltH4,563
80
+ parsek_cdp/cdp/emulation/functions.py,sha256=sV-adlN-tQulX_YuIQVytz9oz-UdYCFtAT0QR3JDSSk,37161
81
+ parsek_cdp/cdp/emulation/types.py,sha256=fSXaYyz0qxBIcCkqHWVRG8TqwhJM2lqmwAJR1_hGPpU,10624
82
+ parsek_cdp/cdp/eventbreakpoints/__init__.py,sha256=GZRn71_tPcRtQVBsy1PoDJLuziFARSe3UX8USAoF9gk,721
83
+ parsek_cdp/cdp/eventbreakpoints/events.py,sha256=Ue9bD0yix24WbUuQqnuSsGk5Dpm2HirGE_PlKfOEL0Y,331
84
+ parsek_cdp/cdp/eventbreakpoints/functions.py,sha256=bEs33b5D5wQaUodTJBnY7UVwoU12FCjsj0Y3NV5_PIY,1573
85
+ parsek_cdp/cdp/eventbreakpoints/types.py,sha256=wXa-0WWl95yf1yaZuwMvjcZqFtSghV6cJJcy8YyCook,305
86
+ parsek_cdp/cdp/extensions/__init__.py,sha256=PmQy4Rk19qwd2_5OcH_SLVAm6wWiXmf5UJPWk1wjKyk,667
87
+ parsek_cdp/cdp/extensions/events.py,sha256=fsdZ4MhmUA7IJdLrOKaLL1kIOX_fWifW0HqCKG6Gw5s,325
88
+ parsek_cdp/cdp/extensions/functions.py,sha256=ybHUzBgjwIgzoV5qV39KoumjDtB_z1uZFh1MqopC_5E,5357
89
+ parsek_cdp/cdp/extensions/types.py,sha256=i8ktOWBN52ONlh_ENJUgzgHfBUZeSL-WPkRVdGHrPOo,491
90
+ parsek_cdp/cdp/fedcm/__init__.py,sha256=ehmuM0X3u9ki1xQh2Xv2d42BZibDN6H6pXcisbL_l4A,622
91
+ parsek_cdp/cdp/fedcm/events.py,sha256=ELqwlZ6CuttoihmyTrmg4y7WmcSJB2yv6-c-8FAU124,1365
92
+ parsek_cdp/cdp/fedcm/functions.py,sha256=RMoJQ8RaAG5H9_zscibyEByFgNWzisuZwl6cdrMF7BA,3865
93
+ parsek_cdp/cdp/fedcm/types.py,sha256=wVN750JdxoSgOMQ-HxoeYBsVKl7TS_aaBOznPJ4PyrQ,2398
94
+ parsek_cdp/cdp/fetch/__init__.py,sha256=GB1z-VdptPUkvz_RTtqZDfzdhGptbFn7rvUXS6CsgHo,622
95
+ parsek_cdp/cdp/fetch/events.py,sha256=cqlLIYsWapLRvIz5xrpxAFZ_xYf0h7JUZDBNt9gTeKM,3839
96
+ parsek_cdp/cdp/fetch/functions.py,sha256=gGBMrEIQo2bcjXCF0kV4rPKLeJUB7KDELTXSGT2Fe2U,12552
97
+ parsek_cdp/cdp/fetch/types.py,sha256=HGLQI6Jdk6TU8HjygSfi8AkmRehnEH-97bfN1mTMqYU,2707
98
+ parsek_cdp/cdp/filesystem/__init__.py,sha256=y36LxcK1WUx2mqAAfxYOzgft54-PwJUerWgwq67CM1Y,667
99
+ parsek_cdp/cdp/filesystem/events.py,sha256=LLPGqe8IVX1K4Bz59bddL7Awn5ApoGnxyUXcRmpB2So,325
100
+ parsek_cdp/cdp/filesystem/functions.py,sha256=A5LN8h85i9xWY2OYjSh31xnNeAC2qVV9y64Iw8Mf7y0,1279
101
+ parsek_cdp/cdp/filesystem/types.py,sha256=lRLenupoF9jIaPTUlzzlw57CcYVLCs0Reb09zm64EgU,1980
102
+ parsek_cdp/cdp/headlessexperimental/__init__.py,sha256=Trk8JKia8ozgSrYbyBXgn5IAU1QnrAf6htGWwPKKfbQ,757
103
+ parsek_cdp/cdp/headlessexperimental/events.py,sha256=0tySOnglvczw11tlfHO4MfQERo5TSq38pDy-WwIY3ck,335
104
+ parsek_cdp/cdp/headlessexperimental/functions.py,sha256=RI36yLJpndezlA_xjEsy6JErAQlZ_JMzfd44jVjLLlc,3781
105
+ parsek_cdp/cdp/headlessexperimental/types.py,sha256=fH1cmdY5Gb7dRVYuWLjlpv7bpL4mwKU3cyz2F0_niSA,850
106
+ parsek_cdp/cdp/heapprofiler/__init__.py,sha256=QHrjJWD8XrbL_GMqGeYRpq4DTTYgmV9EUHKdAg9pipg,685
107
+ parsek_cdp/cdp/heapprofiler/events.py,sha256=wktCzLApLcvunxYA6gQyaJd3y_G7WMesc2laArVtJJM,2160
108
+ parsek_cdp/cdp/heapprofiler/functions.py,sha256=2DIvhwFdBOwzu-yjwzocBvtUQfh-uJPQ_gjXg4y6bag,10448
109
+ parsek_cdp/cdp/heapprofiler/types.py,sha256=qsFunTQC5LPYELBymX8M3T0rPkUrGENQhOsFvPoA66k,2185
110
+ parsek_cdp/cdp/indexeddb/__init__.py,sha256=b_yASUyf88STmwcmtfBv3OoO5dmVxizy25NMJz38BAI,658
111
+ parsek_cdp/cdp/indexeddb/events.py,sha256=defQ8xxMS8CToM3qiTZUUDE5CT3lwrkCW_26P-FO-44,324
112
+ parsek_cdp/cdp/indexeddb/functions.py,sha256=9b6OeRDQ-44IDhX12pSPjUAkHpDU5JR7TyGAP5n5fTA,13128
113
+ parsek_cdp/cdp/indexeddb/types.py,sha256=J-d9WEJwiMGu3zSSt3qa6JdRj2Ft2Gd93eG6XgmmowA,4234
114
+ parsek_cdp/cdp/input/__init__.py,sha256=gBjKwzyhTdFReqe76BPZ45-PNsCwJzj07QtAwuYa3Ms,622
115
+ parsek_cdp/cdp/input/events.py,sha256=zuEBbNHRCE_5-d699ODchsu4RbOxVnPTZgXZqDcTKdI,753
116
+ parsek_cdp/cdp/input/functions.py,sha256=W1YfwqXBFeJAJURx30Bme8jrjvknRMDDhxE6ocvwyzo,24428
117
+ parsek_cdp/cdp/input/types.py,sha256=Z8QIfiN7P7FpMP3GpBN7LBeEgvnyFA1npTUZhsXG8OA,2880
118
+ parsek_cdp/cdp/inspector/__init__.py,sha256=By_HT0VaM36eUlfPj-lh7N4gWHB_-VlDzytpDZcc4hc,658
119
+ parsek_cdp/cdp/inspector/events.py,sha256=XC0_z0-62164EGj_ctH0ZxJe9kK334vvAJxn2kpBbDM,1269
120
+ parsek_cdp/cdp/inspector/functions.py,sha256=8_4KBhdlPK4-QwbJgZUSBJPwJ1Q2bliTNHq2ba9LtRo,846
121
+ parsek_cdp/cdp/inspector/types.py,sha256=oFQRPHyjUSt3j1Gjrl4BUR9VU-j8IKoIul2dPDXL_IQ,298
122
+ parsek_cdp/cdp/io/__init__.py,sha256=dsk9AoRXfnYDqC-fOkV9Y5COX74ioNHdCLujYoaqhzI,595
123
+ parsek_cdp/cdp/io/events.py,sha256=On7dqVkpVEBgejV5ZTPFYxMaboKgtNp4QM5qlF2w3BU,317
124
+ parsek_cdp/cdp/io/functions.py,sha256=8CBzq2EEQuWfKxy6yzkazdG8zxGE1utKNddBFNGu-dc,3003
125
+ parsek_cdp/cdp/io/types.py,sha256=xQXp8RuF2adoQJobye23dE8KyeQCYYhC9dza5ko7VME,414
126
+ parsek_cdp/cdp/layertree/__init__.py,sha256=sBTk4JoGCHK0RRX6nfnVLitrP9SWRDA_EtTI7jbRkFE,658
127
+ parsek_cdp/cdp/layertree/events.py,sha256=t8Oo-2th2fniRhCbZba7siePVtsV72jebpVkfSVB4SA,1057
128
+ parsek_cdp/cdp/layertree/functions.py,sha256=OmUOY1baHcSoov8dmZ62uHjNPsb3wvcwxvpKGTjcPg8,7836
129
+ parsek_cdp/cdp/layertree/types.py,sha256=DWm71UmX3FyWh1eMUSQ66rIGD6-RnpQVClWAr_WfDWg,4266
130
+ parsek_cdp/cdp/log/__init__.py,sha256=vwf1vhF5MBL1NWPvJrZvyolAfhekYjWEM8g1OLD4lQ8,604
131
+ parsek_cdp/cdp/log/events.py,sha256=SEuDTRcjSqSkMt4flVFny-_TqK5yvypYMWGv2OdqlzA,614
132
+ parsek_cdp/cdp/log/functions.py,sha256=o2M88tdwYLyRVS4eDA-6XI9ivpJVYaGYD1rldRGO2_M,1933
133
+ parsek_cdp/cdp/log/types.py,sha256=NjDatkmF94kgdI3Mik84_skul7rcysWdW9vQSefr5rs,2552
134
+ parsek_cdp/cdp/media/__init__.py,sha256=B39KkY0XqiFSuRCG_eazzJ77L3GL8Iy1jpIjxvQhhIs,622
135
+ parsek_cdp/cdp/media/events.py,sha256=cie2kKu8RIMRDPfInveJkjtLiLeBWTOOHYs050327v8,2985
136
+ parsek_cdp/cdp/media/functions.py,sha256=OtyDyWfbyDIr2Np15mKqvjy3txNzH8JLdjZtB8tNFxc,797
137
+ parsek_cdp/cdp/media/types.py,sha256=OcqcyiDqdY1KvbkneScKuWKl0U6ld8KRqsVp04fPo_k,3128
138
+ parsek_cdp/cdp/memory/__init__.py,sha256=qAzhUCOwNkpmo-y5HEFyDXwaAzvAqJnUIvPNvQUJILo,631
139
+ parsek_cdp/cdp/memory/events.py,sha256=jTUxAt026nrR22Qoi2wXKgvlZGa5QEBaiFCo6Amqt5s,321
140
+ parsek_cdp/cdp/memory/functions.py,sha256=6SFlLyzwnHswnFsItr8kOvsc4qXkne3e1e6HbrFZ0-8,6695
141
+ parsek_cdp/cdp/memory/types.py,sha256=jKdc9XvKjJqw63C5nvByiiEvmFAHl7YKuqWXK99BR6g,2176
142
+ parsek_cdp/cdp/mixins/__init__.py,sha256=WkoB2apw6BFqubhnxxAcxlIk7TT2BLM_MCKWvThebKI,338
143
+ parsek_cdp/cdp/mixins/datatype.py,sha256=kR2xEOggTxDFh2kxOf25N0t72d9PAhWHBfQibTUktBQ,4324
144
+ parsek_cdp/cdp/mixins/event.py,sha256=rMR1Q81q-4TGtwTYi6RMHaO1mFQFRurws1fevj2n-ac,2573
145
+ parsek_cdp/cdp/mixins/namespace.py,sha256=w7ZkmYvKClED9TQbO0mV13k0u5U17NvZe-sieZczmzA,1236
146
+ parsek_cdp/cdp/network/__init__.py,sha256=DA-5zYfrJmY_woojC6frs9xnwxGhpNs-N83uiXPsH0Y,640
147
+ parsek_cdp/cdp/network/events.py,sha256=QCxZBV3QLrOB9P-SSu01zz8ath4cMkZT9F0bpN1cvjw,29026
148
+ parsek_cdp/cdp/network/functions.py,sha256=157V918xhYr-yHTAzxEbew5ogsx-yAdyWwVSyzryRfI,39746
149
+ parsek_cdp/cdp/network/types.py,sha256=um3jZcfP-lRdlD3iHQc6qb8fjF-nPXxmM6aVY-XaGKo,52811
150
+ parsek_cdp/cdp/overlay/__init__.py,sha256=J2WyK6yOKlE1gRer4ZBo311N55cj7GropNxF-ZsLKFY,640
151
+ parsek_cdp/cdp/overlay/events.py,sha256=1WRIh5qeIcOf-SrfUnwAe6DgsPDzCnNGeOWQsIEMH1k,1816
152
+ parsek_cdp/cdp/overlay/functions.py,sha256=W8RJ3Q_0oaRoOHQLMYNlCORdjCsnasNQ_IMscVecQ1M,21690
153
+ parsek_cdp/cdp/overlay/types.py,sha256=3cjbcQHDaWb0zDUNzXdo_YFgVfNzyyJIaYWAE5c2a80,15724
154
+ parsek_cdp/cdp/page/__init__.py,sha256=MaqZiUMS3XyjZmZI9OkCdccn6teO71GuCwsS1fyPwfM,613
155
+ parsek_cdp/cdp/page/events.py,sha256=hUh1PzZse5Cc7xXYm37GZ1WqB53-ZRdWmq9QJFrDVaM,14719
156
+ parsek_cdp/cdp/page/functions.py,sha256=8_Dk4yqbXVh2JGHG7Tvg8yop7A45KZu_D0UvteTQtg8,54184
157
+ parsek_cdp/cdp/page/types.py,sha256=njOSV_CfB43V6aAIihKwMvDC_Os94uf479UqFWQ9x3U,44466
158
+ parsek_cdp/cdp/performance/__init__.py,sha256=0B_iaoBWoG1_UTw7ZGnmqi6HOUriR0Da_nPOlKnhnXw,676
159
+ parsek_cdp/cdp/performance/events.py,sha256=zSdi-4mpMgp2FCI-OQ_djIqMq9vT1Zy3oVCdcrjoPpE,743
160
+ parsek_cdp/cdp/performance/functions.py,sha256=zYTANCcqzAzGApc_LAzKpINM_KMj4-3AYDaBObd1-3k,2470
161
+ parsek_cdp/cdp/performance/types.py,sha256=wdIjKWYq42DuCyLJ0O7ZjhLaYZ30alqf3q3johqx4iE,599
162
+ parsek_cdp/cdp/performancetimeline/__init__.py,sha256=HQCaYH4sp-mujXaUY80wnBeT5BSZ9D2mr14bD_ijS0E,748
163
+ parsek_cdp/cdp/performancetimeline/events.py,sha256=4416xKzhosel5qP92U7ZzrY3HID6W7b7sJXyzL7by0M,752
164
+ parsek_cdp/cdp/performancetimeline/functions.py,sha256=Z4qu9InYdCE_IhacKK3j0bK7NIuy1rodseqHqOeLBoc,1258
165
+ parsek_cdp/cdp/performancetimeline/types.py,sha256=JGvSKEJR7mqFnfgWvSkLG95xnVs7eaKqzW6THxALcaQ,3562
166
+ parsek_cdp/cdp/preload/__init__.py,sha256=VhgSVVQlp9kjBAvVvDysP4ZW4Ywvgd2nxTMrmWx0XqU,640
167
+ parsek_cdp/cdp/preload/events.py,sha256=FGS5BtBAnuESTC19qCJMmMP411fBmyUWrZjLu40PCOQ,5009
168
+ parsek_cdp/cdp/preload/functions.py,sha256=8B77CfNtCBXvVBn-NXI9NTUx1AARnsL4aH3jeQI_cVk,727
169
+ parsek_cdp/cdp/preload/types.py,sha256=6ftjjU6W1QnfWPQM5kVLAv-X4agsrk4lAfNHTMtCl4M,13058
170
+ parsek_cdp/cdp/profiler/__init__.py,sha256=5_VN93xnLlChm2CfqkwQqfEcVqjglPy2zIRGxfwm3Bs,649
171
+ parsek_cdp/cdp/profiler/events.py,sha256=P7M9AUqRSw6elZG8z8pY5gbEyBhbD5FKatKZRnjpwt8,2378
172
+ parsek_cdp/cdp/profiler/functions.py,sha256=EFJYqGiyNFoguA0ql2kmc1Acrp2cRxjznh2XJUrLSA0,5374
173
+ parsek_cdp/cdp/profiler/types.py,sha256=yQGsI78SCMeG8Ps2WbCyx_u5Kvwpb8DxpZ-dpBVL2pM,4060
174
+ parsek_cdp/cdp/pwa/__init__.py,sha256=DAE2OfBEOJ33kdXbsAF9p3Tzg4rP6BTbOzqrjHktprk,604
175
+ parsek_cdp/cdp/pwa/events.py,sha256=oyyUM9fXgLV3RzcT4KeGdsqG3ZUyHv3V_61kjZF529k,318
176
+ parsek_cdp/cdp/pwa/functions.py,sha256=f3om_8iV1DDG1LZy2iDCCbL-NNUJvz42waZ4zBaRMfo,9050
177
+ parsek_cdp/cdp/pwa/types.py,sha256=GWSuwI6obWA3t2HMLsGcnXiQMRqZGs6CAfNiW6V2smE,1537
178
+ parsek_cdp/cdp/runtime/__init__.py,sha256=EerA8DP3dREeWYfgrKfwixQy7flN77T1EtMY8mHxPqQ,640
179
+ parsek_cdp/cdp/runtime/events.py,sha256=E-gL6kVQr3w2mZvZK1MNe7MCgg_gMojn5L6WeEDLkDs,4581
180
+ parsek_cdp/cdp/runtime/functions.py,sha256=-cjueyBqLmxCBY3-R4ZBZUpZJJtwumJar2efslqLVbY,32171
181
+ parsek_cdp/cdp/runtime/types.py,sha256=gM26su7FP5SpfX-_L0Ug9yl8PjlAkKpnJa0bD-q4WwM,13802
182
+ parsek_cdp/cdp/schema/__init__.py,sha256=uP21q3fWhJvrXcHkjEWgaUY2xf_R5NJ2FEHGATvgrxE,631
183
+ parsek_cdp/cdp/schema/events.py,sha256=0P7AKBdf3Yr-oVeRySdlCAU_9TteINABY25HSRGvEbI,321
184
+ parsek_cdp/cdp/schema/functions.py,sha256=BoEQYgR3C6xDU1eARb_NgwuFd2D5EzCISMXsr9X-LhE,1003
185
+ parsek_cdp/cdp/schema/types.py,sha256=7VWRqhphK-DHlL_TZ8s3SjNuZzPfWZb56XCeIQ-khVU,602
186
+ parsek_cdp/cdp/security/__init__.py,sha256=XzM6LEprIZLzEV9FpJG1dTRL5OIfeGgORottppBN7ZQ,649
187
+ parsek_cdp/cdp/security/events.py,sha256=-ii4pCSY62vR3Qmt1O5IRnbObOahTIxxxsfqcfoY0Rw,2584
188
+ parsek_cdp/cdp/security/functions.py,sha256=w1UZ0k3gPBtEMwkwfpMZ3ShY-fJdM0pGNKLWF9SEhu0,2744
189
+ parsek_cdp/cdp/security/types.py,sha256=Tshu09AvUBCVbSR-iVkiwC3v6mQ0OYln-jBUB0-rMXI,7350
190
+ parsek_cdp/cdp/serviceworker/__init__.py,sha256=sMIBUlvbOmJSeyOqUo6nZzDzLGFPmH-qiBqE5bafGfQ,694
191
+ parsek_cdp/cdp/serviceworker/events.py,sha256=FvMYho-HhsFpJ6--STYZKnt3KTx5szhQcShQNyGuZVc,1525
192
+ parsek_cdp/cdp/serviceworker/functions.py,sha256=2bZpAL679sgBqqKwIbWiDM-mGCzLA2fENA3Wy4jrka4,5013
193
+ parsek_cdp/cdp/serviceworker/types.py,sha256=CI0fWU5JMthQOPFonXd2VD_XpaZbksFQvXM7CTbI6Wg,3734
194
+ parsek_cdp/cdp/storage/__init__.py,sha256=WKH4Nb_L3DIggxz9HKcj7kLbTZukxDZ0oGy_Q8CRe68,640
195
+ parsek_cdp/cdp/storage/events.py,sha256=ZlKx_dtc9qofLBR0xmHkFumyYxJaexM4zeFwa30qxkQ,11985
196
+ parsek_cdp/cdp/storage/functions.py,sha256=MLfsp7npfH38Ad7Tc0oQEj0uFMTDL0LAA3-cKJwCOno,25697
197
+ parsek_cdp/cdp/storage/types.py,sha256=CntHIb1pzdI7bL_p3e4PLj1nOfUYn7ia02syDcHAdGs,29345
198
+ parsek_cdp/cdp/systeminfo/__init__.py,sha256=1Ewwu7hETnN9YBT7OHmu-gm1YVIjMiXtbJd-OFl5IFs,667
199
+ parsek_cdp/cdp/systeminfo/events.py,sha256=3Nq5NPBFUtHeT0WLWl0-OwtRd0stwN0mlxeQNKhHkw0,325
200
+ parsek_cdp/cdp/systeminfo/functions.py,sha256=9tOFwNVufyr690m37GAV32o0bnk7DZaTgl01VeMzNh0,2627
201
+ parsek_cdp/cdp/systeminfo/types.py,sha256=WyNGkIrCKdr-DWmv3LE3XrZI32IHDpEi5xQkUQKvwyQ,4977
202
+ parsek_cdp/cdp/target/__init__.py,sha256=tFi0kDV2PwV1lXmML93F4dBC6Pqbo5M518QJNgp4DuY,631
203
+ parsek_cdp/cdp/target/events.py,sha256=FzguJl9WLxCEAJYTee_wQXPXB5UQIuyevrLYTlRse_E,3553
204
+ parsek_cdp/cdp/target/functions.py,sha256=y-jtKc-kM-cNg2FNZvTYBlHx54HYiRvJHoNt4JsLUHo,22063
205
+ parsek_cdp/cdp/target/types.py,sha256=t78654p-hMzA85g9gCEoPDZxE437seAZDfUXF7EgTCs,2812
206
+ parsek_cdp/cdp/tethering/__init__.py,sha256=zSuIpyhT0zGoV2GCRmoGMB8UZsva6JX0pgkx8x10Cws,658
207
+ parsek_cdp/cdp/tethering/events.py,sha256=A8aN8Qgmz8jxl_FDdeyS4Z-tt_IeEs28jqFJTMEOIPg,665
208
+ parsek_cdp/cdp/tethering/functions.py,sha256=uJm7o_rqzmootTs2WbMVKjb2W0KSQLGkeyFyMr8mW9k,1127
209
+ parsek_cdp/cdp/tethering/types.py,sha256=PdSpHkHC6EybHuwlCHGogh3kWBQVpK2SDjOhKf7N_-4,298
210
+ parsek_cdp/cdp/tracing/__init__.py,sha256=J2dG92DYeGPAoIVdj_MwO3kMYhFiPmMEStpBdpAUm4U,640
211
+ parsek_cdp/cdp/tracing/events.py,sha256=73sJwcltyc44IP_ZZKIM-bXUSwQPlo2OhMCJFvEjTLk,2185
212
+ parsek_cdp/cdp/tracing/functions.py,sha256=q_BvYOJfmIRPlQfZJDAd0qwGYBn8_9oIfkIcfYTOwGI,6089
213
+ parsek_cdp/cdp/tracing/types.py,sha256=CApXA--2NfIrwxfXeUtMJT0O-YXzMd4tmPABDlT7PRw,3322
214
+ parsek_cdp/cdp/webaudio/__init__.py,sha256=0lz0zii9Dm29uIlksQQk-0k7psyEr8qg3iVhibuZYWw,649
215
+ parsek_cdp/cdp/webaudio/events.py,sha256=eIKTT0IbLsr5Jzsu_pYrrcLCWoaE8xjbFYEnZAAYLos,6825
216
+ parsek_cdp/cdp/webaudio/functions.py,sha256=BmLz-05TYklcoI_zP2K0wSgxmo6YKNhLzFwzGK9L4w0,1747
217
+ parsek_cdp/cdp/webaudio/types.py,sha256=uYfuu5IMj8S9VHCtwcNNmCyTFoMkZXM1mUy3HT2uxSo,5684
218
+ parsek_cdp/cdp/webauthn/__init__.py,sha256=XKdgvhWFSRyq8YMxDXLlHJovae1QQWn9yuxz6hWxrkY,649
219
+ parsek_cdp/cdp/webauthn/events.py,sha256=q2mc4raXG6Zz555-nW6PGUjvnhlAUAmBJcsqM5xCkSM,2309
220
+ parsek_cdp/cdp/webauthn/functions.py,sha256=dv88RCb83Ek9kK4zNEII1gkLWw4Kfb_ZFojhTmj6hBM,10140
221
+ parsek_cdp/cdp/webauthn/types.py,sha256=Sv9OncIeBk_mbC74LS9lDG5VgL1V9t4GfkJX85tq8NE,3957
222
+ parsek_cdp/core/__init__.py,sha256=ZhGS9vIBAbgxw60cw82CdXMcK-3Wqpnja9UBT0GpTV8,403
223
+ parsek_cdp/core/browser.py,sha256=FFf-YVRzwEjb4-c0vDsyD7mw-LbxV2VcdK9qbqbYR3I,9623
224
+ parsek_cdp/core/browser_context.py,sha256=1WUcqGikcDNqpkjQ2UXlWJwXkPv6_80jL2qOJnwk1Hg,1882
225
+ parsek_cdp/core/element.py,sha256=F6QFbMUNPFdGPModK3xW8h2S0-Bco3kEA7S4hXrr4VU,14824
226
+ parsek_cdp/core/feature.py,sha256=z3m_3q0AgUnzyWVHblMBPINS0yb8rgoNsExTYn340XE,15821
227
+ parsek_cdp/core/frame.py,sha256=ay2VBGrTiBRXrEi0XjviM80VPx579OMgq5nbnCKGb1w,13208
228
+ parsek_cdp/core/pagable.py,sha256=vgpF9NIYvXPYzRL3f0ejkeEK54bqVH-PQTxxUBad-Ig,6940
229
+ parsek_cdp/core/page.py,sha256=3l6Qa5FcB80PQmsDU9jnE8D0X5tpSxyUd-HI5jCVSuY,6213
230
+ parsek_cdp/core/target.py,sha256=g6SYHB4uvROUG5S-4PEKefwfhZeq7kSW6ywCbaWWX4s,19340
231
+ parsek_cdp/features/__init__.py,sha256=9cnhHmocYGR9TNCjC9XWWYjIq2yMh0jIUnxx5KyEdg4,558
232
+ parsek_cdp/features/request_listener/__init__.py,sha256=xGzqOb8OepQaINN5XruKI3C8dDkgdyId65Hr8RZjFRE,10744
233
+ parsek_cdp/features/request_listener/events.py,sha256=dUoJd7pztyUzvWRLN7lPqKLUjyBMWzaWpX4-dtc0Sm8,1575
234
+ parsek_cdp/features/request_listener/types.py,sha256=EOC5Pqc29VF94QbARqT9fh0o4ewm4S5GqutM0ESmDlQ,7381
235
+ parsek_cdp/parsek/__init__.py,sha256=AaGFMuaS3PpuMO84fu_BwKSjzmFIMYqh5F8s8ExJahw,597
236
+ parsek_cdp/parsek/events.py,sha256=PzO2hEcMyKAe74zHgShFQpDtwZvndUovAUj60dbF4eY,1386
237
+ parsek_cdp/parsek/types.py,sha256=lAZgeAJvy_jxtvJ7bWdto4teA0Xb26yIXHm5ul1x-bI,1241
238
+ parsek_cdp-0.1.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
239
+ parsek_cdp-0.1.0.dist-info/METADATA,sha256=GbERxP6x7gb8NtuTSU0WQrGuxLc_X_Z7SbhTyPsmpeI,9562
240
+ parsek_cdp-0.1.0.dist-info/WHEEL,sha256=aeYiig01lYGDzBgS8HxWXOg3uV61G9ijOsup-k9o1sk,91
241
+ parsek_cdp-0.1.0.dist-info/top_level.txt,sha256=CYJx3y04L_ZC7ylHxzao4GhFcM_WTKPRD-7JTQzUEFM,11
242
+ parsek_cdp-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (82.0.1)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+