cdpify 0.4.0__tar.gz → 0.5.0__tar.gz

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 (365) hide show
  1. cdpify-0.5.0/CHANGELOG.md +214 -0
  2. cdpify-0.5.0/MANIFEST.in +2 -0
  3. {cdpify-0.4.0 → cdpify-0.5.0}/PKG-INFO +174 -18
  4. {cdpify-0.4.0 → cdpify-0.5.0}/README.md +173 -17
  5. cdpify-0.5.0/RELEASING.md +76 -0
  6. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/__init__.py +11 -2
  7. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/client.py +63 -12
  8. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/codec.py +43 -4
  9. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/commands.py +65 -5
  10. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/domain.py +94 -41
  11. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/events.py +9 -2
  12. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/types.py +95 -1
  13. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/types.py +46 -0
  14. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/commands.py +46 -0
  15. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/domain.py +59 -28
  16. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/events.py +12 -0
  17. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/types.py +97 -0
  18. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/commands.py +22 -0
  19. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/domain.py +16 -10
  20. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/types.py +154 -0
  21. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/commands.py +14 -0
  22. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/domain.py +22 -10
  23. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/events.py +7 -0
  24. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/types.py +53 -0
  25. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/domain.py +16 -13
  26. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/types.py +24 -0
  27. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/commands.py +18 -0
  28. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/domain.py +70 -60
  29. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/types.py +18 -0
  30. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/commands.py +156 -13
  31. cdpify-0.5.0/cdpify/domains/browser/domain.py +519 -0
  32. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/events.py +34 -2
  33. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/types.py +79 -6
  34. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/commands.py +53 -0
  35. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/domain.py +57 -28
  36. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/types.py +42 -0
  37. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/domain.py +18 -16
  38. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/types.py +4 -0
  39. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/events.py +3 -0
  40. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/types.py +18 -0
  41. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/types.py +3 -0
  42. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/commands.py +242 -11
  43. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/domain.py +234 -152
  44. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/events.py +16 -0
  45. cdpify-0.5.0/cdpify/domains/css/types.py +1293 -0
  46. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/commands.py +313 -7
  47. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/domain.py +334 -144
  48. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/events.py +162 -1
  49. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/types.py +102 -2
  50. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/domain.py +10 -7
  51. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/types.py +3 -0
  52. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceorientation/commands.py +9 -0
  53. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceorientation/domain.py +12 -4
  54. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/commands.py +14 -0
  55. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/domain.py +18 -6
  56. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/commands.py +474 -19
  57. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/domain.py +540 -249
  58. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/events.py +126 -10
  59. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/types.py +171 -0
  60. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/commands.py +61 -3
  61. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/domain.py +93 -42
  62. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/types.py +31 -1
  63. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domsnapshot/commands.py +52 -1
  64. cdpify-0.5.0/cdpify/domains/domsnapshot/domain.py +134 -0
  65. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domsnapshot/types.py +288 -0
  66. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/domain.py +18 -13
  67. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/types.py +9 -0
  68. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/commands.py +352 -23
  69. cdpify-0.5.0/cdpify/domains/emulation/domain.py +1238 -0
  70. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/events.py +9 -2
  71. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/types.py +174 -6
  72. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/eventbreakpoints/commands.py +6 -0
  73. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/eventbreakpoints/domain.py +14 -7
  74. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/commands.py +51 -0
  75. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/domain.py +63 -22
  76. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/types.py +15 -0
  77. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/commands.py +5 -0
  78. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/domain.py +32 -24
  79. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/events.py +4 -0
  80. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/types.py +3 -0
  81. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/commands.py +96 -1
  82. cdpify-0.5.0/cdpify/domains/fetch/domain.py +298 -0
  83. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/events.py +49 -0
  84. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/types.py +35 -0
  85. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/commands.py +3 -0
  86. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/domain.py +6 -6
  87. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/types.py +19 -0
  88. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/findinpage/domain.py +5 -4
  89. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/commands.py +29 -0
  90. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/domain.py +32 -11
  91. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/types.py +9 -0
  92. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/commands.py +74 -0
  93. cdpify-0.5.0/cdpify/domains/heapprofiler/domain.py +262 -0
  94. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/events.py +5 -0
  95. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/types.py +23 -0
  96. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/indexeddb/commands.py +128 -0
  97. cdpify-0.5.0/cdpify/domains/indexeddb/domain.py +311 -0
  98. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/indexeddb/types.py +79 -0
  99. cdpify-0.5.0/cdpify/domains/input/commands.py +518 -0
  100. cdpify-0.5.0/cdpify/domains/input/domain.py +573 -0
  101. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/input/events.py +2 -1
  102. cdpify-0.5.0/cdpify/domains/input/types.py +138 -0
  103. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/events.py +4 -1
  104. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/commands.py +30 -1
  105. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/domain.py +31 -12
  106. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/commands.py +60 -0
  107. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/domain.py +67 -31
  108. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/events.py +9 -0
  109. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/types.py +76 -0
  110. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/commands.py +3 -0
  111. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/domain.py +9 -4
  112. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/events.py +3 -0
  113. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/types.py +36 -0
  114. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/types.py +23 -0
  115. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/commands.py +15 -0
  116. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/domain.py +25 -12
  117. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/types.py +29 -0
  118. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/commands.py +315 -15
  119. cdpify-0.5.0/cdpify/domains/network/domain.py +939 -0
  120. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/events.py +441 -21
  121. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/types.py +1002 -35
  122. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/commands.py +157 -2
  123. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/domain.py +261 -133
  124. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/events.py +12 -0
  125. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/types.py +314 -0
  126. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/commands.py +520 -24
  127. cdpify-0.5.0/cdpify/domains/page/domain.py +1583 -0
  128. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/events.py +223 -14
  129. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/types.py +472 -19
  130. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/commands.py +11 -1
  131. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/domain.py +18 -9
  132. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/events.py +6 -0
  133. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/types.py +6 -0
  134. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/commands.py +7 -0
  135. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/domain.py +13 -4
  136. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/types.py +29 -0
  137. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/events.py +11 -0
  138. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/types.py +30 -0
  139. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/commands.py +29 -0
  140. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/domain.py +24 -11
  141. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/events.py +23 -0
  142. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/types.py +68 -0
  143. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/commands.py +21 -0
  144. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/domain.py +52 -28
  145. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/types.py +4 -0
  146. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/commands.py +297 -1
  147. cdpify-0.5.0/cdpify/domains/runtime/domain.py +697 -0
  148. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/events.py +51 -1
  149. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/types.py +268 -7
  150. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/commands.py +3 -0
  151. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/types.py +6 -0
  152. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/commands.py +15 -2
  153. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/domain.py +26 -12
  154. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/events.py +37 -3
  155. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/types.py +131 -3
  156. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/domain.py +37 -39
  157. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/types.py +21 -0
  158. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/domain.py +47 -45
  159. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/events.py +3 -0
  160. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/commands.py +95 -7
  161. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/domain.py +158 -85
  162. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/events.py +47 -1
  163. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/types.py +44 -3
  164. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/commands.py +18 -0
  165. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/domain.py +6 -4
  166. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/types.py +77 -0
  167. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/commands.py +191 -4
  168. cdpify-0.5.0/cdpify/domains/target/domain.py +569 -0
  169. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/events.py +23 -1
  170. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/types.py +53 -3
  171. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/commands.py +6 -0
  172. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/domain.py +14 -7
  173. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/events.py +6 -0
  174. cdpify-0.5.0/cdpify/domains/tracing/commands.py +169 -0
  175. cdpify-0.5.0/cdpify/domains/tracing/domain.py +194 -0
  176. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tracing/events.py +29 -1
  177. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tracing/types.py +41 -4
  178. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/domain.py +6 -4
  179. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/types.py +23 -0
  180. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/commands.py +23 -0
  181. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/domain.py +85 -60
  182. cdpify-0.5.0/cdpify/domains/webauthn/types.py +214 -0
  183. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/commands.py +15 -0
  184. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/domain.py +17 -7
  185. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/events.py +38 -1
  186. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/types.py +45 -0
  187. cdpify-0.4.0/cdpify/exceptions.py → cdpify-0.5.0/cdpify/error.py +36 -0
  188. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/event_queue.py +87 -57
  189. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/dispatcher.py +1 -0
  190. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/router.py +40 -6
  191. cdpify-0.5.0/cdpify/events/source.py +65 -0
  192. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/subscription.py +109 -106
  193. cdpify-0.5.0/cdpify/executor.py +74 -0
  194. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/commands.py +107 -96
  195. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/domain.py +98 -106
  196. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/events.py +126 -113
  197. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/types.py +135 -125
  198. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/utils.py +60 -2
  199. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/views.py +148 -111
  200. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/schemas.py +5 -1
  201. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/commands.py.jinja2 +47 -38
  202. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/domain.py.jinja2 +76 -65
  203. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/events.py.jinja2 +10 -1
  204. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/types.py.jinja2 +52 -43
  205. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/session.py +7 -2
  206. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/enums.py +19 -17
  207. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/transport.py +9 -1
  208. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/transports/websocket.py +37 -25
  209. cdpify-0.5.0/cdpify/unset.py +13 -0
  210. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/PKG-INFO +174 -18
  211. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/SOURCES.txt +9 -2
  212. {cdpify-0.4.0 → cdpify-0.5.0}/pyproject.toml +11 -1
  213. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_client.py +1 -1
  214. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_codec.py +222 -177
  215. cdpify-0.4.0/tests/test_decorators_and_exceptions.py → cdpify-0.5.0/tests/test_decorators_and_errors.py +4 -4
  216. cdpify-0.5.0/tests/test_event_overflow_and_raw.py +109 -0
  217. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_event_subscription.py +2 -2
  218. cdpify-0.5.0/tests/test_executor.py +74 -0
  219. cdpify-0.5.0/tests/test_generated_params.py +40 -0
  220. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_websocket_client.py +173 -168
  221. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_websocket_transport.py +412 -379
  222. cdpify-0.4.0/cdpify/domains/browser/domain.py +0 -409
  223. cdpify-0.4.0/cdpify/domains/css/types.py +0 -673
  224. cdpify-0.4.0/cdpify/domains/domsnapshot/domain.py +0 -101
  225. cdpify-0.4.0/cdpify/domains/emulation/domain.py +0 -960
  226. cdpify-0.4.0/cdpify/domains/fetch/domain.py +0 -229
  227. cdpify-0.4.0/cdpify/domains/heapprofiler/domain.py +0 -195
  228. cdpify-0.4.0/cdpify/domains/indexeddb/domain.py +0 -239
  229. cdpify-0.4.0/cdpify/domains/input/commands.py +0 -250
  230. cdpify-0.4.0/cdpify/domains/input/domain.py +0 -385
  231. cdpify-0.4.0/cdpify/domains/input/types.py +0 -64
  232. cdpify-0.4.0/cdpify/domains/network/domain.py +0 -718
  233. cdpify-0.4.0/cdpify/domains/page/domain.py +0 -1252
  234. cdpify-0.4.0/cdpify/domains/runtime/domain.py +0 -494
  235. cdpify-0.4.0/cdpify/domains/target/domain.py +0 -429
  236. cdpify-0.4.0/cdpify/domains/tracing/commands.py +0 -100
  237. cdpify-0.4.0/cdpify/domains/tracing/domain.py +0 -138
  238. cdpify-0.4.0/cdpify/domains/webauthn/types.py +0 -108
  239. cdpify-0.4.0/cdpify/events/source.py +0 -36
  240. cdpify-0.4.0/cdpify/executor.py +0 -39
  241. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/__init__.py +0 -0
  242. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessibility/__init__.py +0 -0
  243. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/accessors.py +0 -0
  244. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/__init__.py +0 -0
  245. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/commands.py +0 -0
  246. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/ads/domain.py +0 -0
  247. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/animation/__init__.py +0 -0
  248. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/__init__.py +0 -0
  249. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/audits/events.py +0 -0
  250. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/autofill/__init__.py +0 -0
  251. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/__init__.py +0 -0
  252. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/commands.py +0 -0
  253. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/backgroundservice/events.py +0 -0
  254. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/__init__.py +0 -0
  255. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/bluetoothemulation/events.py +0 -0
  256. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/browser/__init__.py +0 -0
  257. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cachestorage/__init__.py +0 -0
  258. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/__init__.py +0 -0
  259. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/commands.py +0 -0
  260. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/cast/events.py +0 -0
  261. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/__init__.py +0 -0
  262. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/commands.py +0 -0
  263. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/console/domain.py +0 -0
  264. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/__init__.py +0 -0
  265. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/commands.py +0 -0
  266. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/crashreportcontext/domain.py +0 -0
  267. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/css/__init__.py +0 -0
  268. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/debugger/__init__.py +0 -0
  269. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/__init__.py +0 -0
  270. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/commands.py +0 -0
  271. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceaccess/events.py +0 -0
  272. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/deviceorientation/__init__.py +0 -0
  273. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/__init__.py +0 -0
  274. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/digitalcredentials/types.py +0 -0
  275. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/dom/__init__.py +0 -0
  276. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domdebugger/__init__.py +0 -0
  277. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domsnapshot/__init__.py +0 -0
  278. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/__init__.py +0 -0
  279. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/commands.py +0 -0
  280. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/domstorage/events.py +0 -0
  281. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/emulation/__init__.py +0 -0
  282. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/eventbreakpoints/__init__.py +0 -0
  283. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/extensions/__init__.py +0 -0
  284. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fedcm/__init__.py +0 -0
  285. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/fetch/__init__.py +0 -0
  286. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/filesystem/__init__.py +0 -0
  287. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/findinpage/__init__.py +0 -0
  288. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/findinpage/commands.py +0 -0
  289. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/headlessexperimental/__init__.py +0 -0
  290. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/heapprofiler/__init__.py +0 -0
  291. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/indexeddb/__init__.py +0 -0
  292. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/input/__init__.py +0 -0
  293. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/__init__.py +0 -0
  294. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/commands.py +0 -0
  295. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/inspector/domain.py +0 -0
  296. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/__init__.py +0 -0
  297. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/io/types.py +0 -0
  298. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/layertree/__init__.py +0 -0
  299. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/log/__init__.py +0 -0
  300. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/__init__.py +0 -0
  301. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/commands.py +0 -0
  302. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/domain.py +0 -0
  303. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/media/events.py +0 -0
  304. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/memory/__init__.py +0 -0
  305. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/network/__init__.py +0 -0
  306. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/overlay/__init__.py +0 -0
  307. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/page/__init__.py +0 -0
  308. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performance/__init__.py +0 -0
  309. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/__init__.py +0 -0
  310. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/performancetimeline/events.py +0 -0
  311. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/__init__.py +0 -0
  312. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/commands.py +0 -0
  313. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/preload/domain.py +0 -0
  314. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/profiler/__init__.py +0 -0
  315. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/pwa/__init__.py +0 -0
  316. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/runtime/__init__.py +0 -0
  317. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/__init__.py +0 -0
  318. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/schema/domain.py +0 -0
  319. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/security/__init__.py +0 -0
  320. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/__init__.py +0 -0
  321. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/commands.py +0 -0
  322. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/serviceworker/events.py +0 -0
  323. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/__init__.py +0 -0
  324. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/commands.py +0 -0
  325. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/smartcardemulation/types.py +0 -0
  326. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/storage/__init__.py +0 -0
  327. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/systeminfo/__init__.py +0 -0
  328. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/target/__init__.py +0 -0
  329. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tethering/__init__.py +0 -0
  330. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/tracing/__init__.py +0 -0
  331. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/__init__.py +0 -0
  332. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/commands.py +0 -0
  333. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webaudio/events.py +0 -0
  334. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/__init__.py +0 -0
  335. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webauthn/events.py +0 -0
  336. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/domains/webmcp/__init__.py +0 -0
  337. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/events/__init__.py +0 -0
  338. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/__main__.py +0 -0
  339. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/downloader.py +0 -0
  340. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/formatting.py +0 -0
  341. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generator.py +0 -0
  342. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/__init__.py +0 -0
  343. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/accessors.py +0 -0
  344. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/constants.py +0 -0
  345. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/context.py +0 -0
  346. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/generators/init.py +0 -0
  347. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/rendering.py +0 -0
  348. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/accessors.py.jinja2 +0 -0
  349. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/domain_init.py.jinja2 +0 -0
  350. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/generator/templates/root_init.py.jinja2 +0 -0
  351. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/py.typed +0 -0
  352. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/decorators.py +0 -0
  353. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/lazy.py +0 -0
  354. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/shared/naming.py +0 -0
  355. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify/transports/__init__.py +0 -0
  356. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/dependency_links.txt +0 -0
  357. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/requires.txt +0 -0
  358. {cdpify-0.4.0 → cdpify-0.5.0}/cdpify.egg-info/top_level.txt +0 -0
  359. {cdpify-0.4.0 → cdpify-0.5.0}/setup.cfg +0 -0
  360. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_dependency_boundaries.py +0 -0
  361. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_enums.py +0 -0
  362. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_event_dispatcher.py +0 -0
  363. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_lazy_imports.py +0 -0
  364. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_models.py +0 -0
  365. {cdpify-0.4.0 → cdpify-0.5.0}/tests/test_session.py +0 -0
@@ -0,0 +1,214 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here.
4
+ Breaking changes are listed first in each release.
5
+
6
+ ## [0.5.0] - Unreleased
7
+
8
+ Release preparation; the publication date will be recorded when 0.5.0 ships.
9
+ See the [migration guide](README.md#upgrading-from-040) before upgrading.
10
+
11
+ ### Breaking changes
12
+
13
+ - Renamed the error module from `cdpify.exceptions` to `cdpify.error`.
14
+ Update imports such as `from cdpify.exceptions import CDPCommandError` to
15
+ `from cdpify.error import CDPCommandError`. The old module is removed;
16
+ error classes remain available from the root package (`from cdpify import
17
+ CDPCommandError`) with the same behavior and inheritance.
18
+ - Optional `any` fields now default to `UNSET`, distinguishing omission from
19
+ JSON `null`. For example, `CallArgument()` omits `value`, while
20
+ `CallArgument(value=None)` sends `{"value": null}`. Ordinary optional scalar
21
+ fields still use `None` to mean omitted. `UNSET` and `UnsetType` are public.
22
+ - `decode_cdp` now raises `CDPDecodeError` for missing required fields, including
23
+ nested models. Unknown fields and future enum values remain supported. Use
24
+ `decode_cdp(Model, payload, strict=False)` for the previous tolerant behavior
25
+ that logs a warning and fills missing required fields with `None`.
26
+ - Command timeouts now cover sending and receiving. The
27
+ `CdpClient(default_timeout=...)` setting is enforced for every transport and
28
+ inherited by session views. Omit the raw `execute(timeout=...)` argument to
29
+ inherit the default; pass `None` to disable it. Set `default_timeout=None` to
30
+ disable the client default entirely.
31
+ - `WebSocketTransport` no longer accepts `default_timeout`; configure it on
32
+ `CdpClient` instead. Standalone transport calls have no deadline unless
33
+ `execute(timeout=seconds)` is specified. Generated methods retain only CDP's
34
+ own parameters; use `asyncio.timeout(seconds)` for an individual caller budget.
35
+ - WebSocket compression is disabled by default for lower local latency. Pass
36
+ `compression="deflate"` to `CdpClient` or `WebSocketTransport` to opt into
37
+ compression when bandwidth matters more.
38
+ - Bounded event buffers now default to `overflow="error"`: overflow terminates
39
+ only the affected stream and raises `CDPEventOverflowError` on its next read.
40
+ Pass `overflow="drop_oldest"` on the client, transport or subscription to keep
41
+ the old lossy behavior. The default queue size remains unlimited (`0`).
42
+
43
+ ### Added
44
+
45
+ - Generated method docstrings include parameter descriptions, units and defaults
46
+ from the spec. Model fields retain their attribute documentation. Experimental
47
+ and deprecated markers are preserved on types, events and fields as well as
48
+ commands.
49
+ - `listen_raw(method=None)` on clients and sessions, and `listen_all_raw()` on
50
+ clients, return `TransportEvent` values with wire names, parameter dictionaries
51
+ and session IDs. None matches every method in the selected scope.
52
+ - Per-subscription overflow overrides and structured `CDPEventOverflowError`
53
+ details (`max_queue_size`, `dropped_events`). Overflow never blocks responses
54
+ or other subscriptions; failed listeners unregister immediately.
55
+ - `compression`, `open_timeout` and `close_timeout` options for URL-based clients
56
+ and the standalone WebSocket transport. Connection timeouts are in seconds.
57
+ - Reproducible codec, dispatch and optional Chrome round-trip benchmarks in
58
+ `benchmarks/runtime.py`; offline regeneration and generated-code drift checks
59
+ in `scripts/check_generated.py`.
60
+ - CI checks the library and public API with Pyright and runs isolated headless
61
+ Chrome tests. Run those locally with `pytest -m integration` and optionally
62
+ `CHROME_PATH`; they are excluded from the default unit-test run.
63
+
64
+ ### Performance
65
+
66
+ - Generated command methods build wire dictionaries directly, avoiding an
67
+ intermediate Params dataclass and reflective field traversal. Public Params
68
+ models and keyword-only command signatures are retained. Nested models still
69
+ serialize through the shared codec.
70
+ - The orjson transport sends UTF-8 bytes directly as text frames and receives
71
+ bytes without first decoding to a Python string. This removes redundant
72
+ UTF-8 conversions while preserving the CDP wire format.
73
+
74
+ ## [0.4.0] - 2026-10-25
75
+
76
+ ### Breaking changes
77
+
78
+ - Named protocol enums are now `StrEnum` subclasses instead of `Literal`
79
+ aliases. Use constants such as `ResourceType.FETCH` and
80
+ `CookieOperation.SET_COOKIE` in typed code. `decode_cdp` returns enum members,
81
+ including in nested models and collections. Unknown strings from newer CDP
82
+ versions remain instances of the corresponding enum with their original
83
+ `.value`; they are not added to its declared members. Inline enums remain
84
+ `Literal` annotations.
85
+ - Matching event listeners now share one decoded model per incoming event and
86
+ event class, including `listen_all()`'s `ReceivedEvent.value`. Mutations are
87
+ visible to other listeners. Treat event data as read-only or make a
88
+ `copy.deepcopy(event)` before changing it privately.
89
+ - All generated type aliases use `type` statements, including primitives and
90
+ arrays, e.g. `type FrameId = str` and `type Quad = list[float]`. Use them in
91
+ annotations; pass plain values such as `frame_id: FrameId = "F1"` instead of
92
+ calling `FrameId("F1")`. For runtime checks use `isinstance(value, str)` rather
93
+ than `isinstance(value, FrameId)`.
94
+ - `Client` and `CDPSession` are renamed to `CdpClient` and `CdpSession`.
95
+ Update imports to `from cdpify import CdpClient, CdpSession` and calls to
96
+ `CdpClient(...)`. `client.session(...)` now returns `CdpSession`.
97
+ - Exceptions follow Python naming: `CDPException` → `CDPError`,
98
+ `CDPConnectionException` → `CDPConnectionError`, `CDPCommandException` →
99
+ `CDPCommandError`, `CDPTimeoutException` → `CDPTimeoutError`. The old names
100
+ still work but emit a `DeprecationWarning` and will be removed in a future
101
+ release.
102
+ - `CDPCommandError` takes `(method, code, message, data=None)` instead of the
103
+ raw error dict. Use `CDPCommandError.from_response(method, error)` to build
104
+ one from a CDP error payload. The message now names the failed method, e.g.
105
+ `Page.navigate failed with CDP error -32000: Cannot navigate to invalid URL`.
106
+ - `listen()`, `listen_all()` and `CdpSession.listen()` are now regular methods
107
+ that return an `EventSubscription` instead of async generators. `async for`
108
+ and `aclose()` keep working. Code that relied on the generator type itself
109
+ (e.g. `inspect.isasyncgen`) or on `asend()`/`athrow()` must be updated.
110
+ - `listen()`, `listen_all()` and `CdpSession.listen()` take the event class
111
+ instead of an event name plus class, and `timeout` is keyword-only:
112
+
113
+ ```python
114
+ # Before
115
+ client.listen(NetworkEvent.REQUEST_WILL_BE_SENT, RequestWillBeSentEvent)
116
+ client.listen(
117
+ event_name=NetworkEvent.REQUEST_WILL_BE_SENT,
118
+ event_type=RequestWillBeSentEvent,
119
+ )
120
+
121
+ # After
122
+ client.listen(RequestWillBeSentEvent)
123
+ ```
124
+
125
+ The CDP name comes from the new `__cdp_event__` class variable on generated
126
+ event classes. For custom dataclasses pass `event_name="Domain.event"`.
127
+ - Calling a deprecated CDP command emits a `DeprecationWarning` instead of
128
+ logging a warning on every call. Python's default filters show it once per
129
+ call site; use `warnings.filterwarnings` or `-W` to change that. The
130
+ decorator is now `warnings.deprecated` (PEP 702) on Python 3.13+, so IDEs and
131
+ type checkers mark deprecated commands. `cdpify.shared.decorators.deprecated`
132
+ requires a message: `@deprecated("...")` instead of `@deprecated()`.
133
+
134
+ ### Added
135
+
136
+ - Optional `max_queue_size` on `CdpClient`, `WebSocketTransport`, `listen()`,
137
+ `listen_all()`, and `CdpSession.listen()`. Zero keeps unlimited buffering;
138
+ bounded queues drop their oldest event instead of blocking command responses.
139
+ Subscriptions inherit the client limit unless overridden. Both subscriptions
140
+ and the standalone WebSocket transport expose `dropped_events` counters.
141
+ - `cdpify[orjson]` enables optional `orjson` encoding and decoding in the WebSocket
142
+ transport, with automatic fallback to `json` and outgoing text frames.
143
+ - Optional `CallbackTransport` protocol in `cdpify.transport` for direct event
144
+ delivery without a transport queue. Existing `Transport` implementations work
145
+ through their event iterator.
146
+ - `EventSubscription` registers its handler as soon as `listen()` is called, so
147
+ events emitted before the first read are no longer lost. It supports
148
+ `async with` for deterministic cleanup and `await events.next(timeout=...)`
149
+ for waiting on a single event. `next()` raises `CDPStreamClosedError` once
150
+ the stream has ended.
151
+ - Generated event classes expose their CDP method name as `__cdp_event__`,
152
+ e.g. `LoadEventFiredEvent.__cdp_event__ == "Page.loadEventFired"`.
153
+ - `FindInPage` domain (`client.find_in_page`) from the latest CDP spec.
154
+
155
+ ### Changed
156
+
157
+ - Generated `__cdp_event__` class variables refer to the domain's event enum,
158
+ e.g. `LoadingFailedEvent.__cdp_event__ is NetworkEvent.LOADING_FAILED`.
159
+ - The root client and session views share the implementation of `listen()`.
160
+ - CI runs tests on Ubuntu, Windows, and macOS with Python 3.12, 3.13, and 3.14,
161
+ including both JSON backends.
162
+ - `CDPTimeoutError` also inherits from the built-in `TimeoutError`, so
163
+ `except TimeoutError` catches command timeouts.
164
+ - Docstrings of generated type aliases follow the alias, so IDEs and Sphinx
165
+ show them on hover.
166
+ - Generated fields only carry `metadata={"cdp_name": ...}` when the CDP name
167
+ differs from the Python name. Code that reads `field.metadata["cdp_name"]`
168
+ directly should fall back to `field.name`.
169
+
170
+ ### Fixed
171
+
172
+ - Distributions include the `py.typed` marker so type checkers recognize the
173
+ installed package's inline annotations.
174
+ - A connection closing while a command is being sent now raises
175
+ `CDPConnectionError` and does not leave an unobserved response-future exception.
176
+ Commands submitted after shutdown starts are rejected immediately.
177
+ - Concurrent disconnects and browser-initiated closure now wait for the same
178
+ cleanup. Cancelling a disconnect waiter no longer interrupts socket cleanup
179
+ or masks cancellation with an error when detaching the event callback.
180
+ - Bounded event streams close even when their buffers are full, preserving
181
+ buffered events on disconnect. Explicit subscription closure releases pending
182
+ events immediately. Subscriptions from an earlier connection stay closed
183
+ after reconnecting.
184
+ - `decode_cdp` now decodes nested models behind `type X = ...` aliases instead
185
+ of leaving them as plain dicts.
186
+ - `decode_cdp` logs a warning when a field annotation cannot be resolved,
187
+ instead of silently leaving nested values as plain dicts.
188
+ - A malformed message from the browser no longer closes the WebSocket
189
+ connection. The message is logged and skipped.
190
+ - Events sent with `"params": null` are delivered with empty params instead of
191
+ being dropped as malformed.
192
+ - Event listeners (`listen()`, `listen_all()`, `CdpSession.listen()`) now end
193
+ when the transport event stream ends or the client disconnects. Previously
194
+ they waited forever unless a `timeout` was set. Events that were already
195
+ received are still delivered before the stream ends.
196
+ - Array type aliases keep their element type instead of `list[Any]`, e.g.
197
+ `DOM.Quad = list[float]` and `Target.TargetFilter = list[FilterEntry]`.
198
+ Fields typed as `TargetFilter` now decode to `FilterEntry` objects instead
199
+ of plain dicts.
200
+ - Generated fields and parameters whose CDP name is a Python keyword get a
201
+ trailing underscore (`or` → `or_`), so the generated code is valid again.
202
+
203
+ ### Performance
204
+
205
+ - The default WebSocket transport delivers events directly to the router,
206
+ removing the intermediate queue and client event-loop task.
207
+ - Event models are decoded lazily once per incoming event and target class,
208
+ then reused by matching listeners. Unread events are not decoded; caches are
209
+ released together with the buffered event instead of being retained globally.
210
+ - `decode_cdp` builds a converter per field once per model instead of
211
+ inspecting type annotations for every value. Decoding typical Network
212
+ events is 4–7× faster (`ResponseReceivedEvent`: 56 µs → 7 µs).
213
+ - `import cdpify` loads CDP domains lazily on first access. Import time drops
214
+ from ~790 ms to ~85 ms.
@@ -0,0 +1,2 @@
1
+ include CHANGELOG.md
2
+ include RELEASING.md
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cdpify
3
- Version: 0.4.0
3
+ Version: 0.5.0
4
4
  Summary: A Python client for the Chrome DevTools Protocol (CDP) optimized for DX.
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.12
@@ -30,12 +30,14 @@ without working with raw JSON messages.
30
30
 
31
31
  - [Why cdpify?](#why-cdpify)
32
32
  - [Installation](#installation)
33
+ - [Upgrading from 0.4.0](#upgrading-from-040)
33
34
  - [Quick start](#quick-start)
34
35
  - [Supported domains](#supported-domains)
35
36
  - [Listening for events](#listening-for-events)
36
37
  - [Working with target sessions](#working-with-target-sessions)
37
38
  - [Configuration](#configuration)
38
39
  - [Development](#development)
40
+ - [Releasing](RELEASING.md)
39
41
  - [Resources](#resources)
40
42
 
41
43
  ## Why cdpify?
@@ -71,16 +73,45 @@ pip install "cdpify[websocket,orjson]"
71
73
  The transport automatically uses `orjson` when available and otherwise uses
72
74
  Python's standard `json` module. Outgoing WebSocket messages remain text frames.
73
75
 
76
+ Generated methods expose only CDP parameters. Parameter docstrings preserve
77
+ the spec's units, defaults and experimental/deprecated markers.
78
+
74
79
  Install the generator dependencies only when regenerating protocol modules:
75
80
 
76
81
  ```bash
77
82
  pip install "cdpify[generator]"
78
83
  ```
79
84
 
85
+ ## Upgrading from 0.4.0
86
+
87
+ Version 0.5.0 includes breaking changes. Review these before updating:
88
+
89
+ | Area | Update for 0.5.0 |
90
+ | --- | --- |
91
+ | Error imports | Replace `cdpify.exceptions` with `cdpify.error`, or import errors from `cdpify`. The old module is removed. |
92
+ | Optional `Any` values | Use `UNSET` to omit a value. `None` now sends JSON `null`; ordinary optional scalar fields still omit `None`. |
93
+ | Required response fields | Generated responses and typed events now raise `CDPDecodeError` when required fields are missing. For tolerant manual decoding, use `decode_cdp(Model, payload, strict=False)`. |
94
+ | Command deadlines | Configure `default_timeout` on `CdpClient`, including for custom transports. The budget covers sending and receiving. `WebSocketTransport` no longer accepts `default_timeout`. |
95
+ | Bounded event buffers | Overflow now raises `CDPEventOverflowError`. Set `overflow="drop_oldest"` to keep lossy buffering. The default buffer remains unlimited. |
96
+ | WebSocket compression | Compression now defaults to `None`. Set `compression="deflate"` to enable it. |
97
+
98
+ Generated methods accept only CDP parameters. For an individual caller deadline,
99
+ wrap the call in `asyncio.timeout(seconds)`; a CDP parameter named `timeout`
100
+ keeps the units and meaning defined by the protocol. The raw `execute()` method
101
+ accepts a client timeout in seconds: omit it to inherit the client default or
102
+ pass `None` to disable that deadline for the call.
103
+
104
+ See the [0.5.0 changelog](CHANGELOG.md#050---unreleased) for the complete release
105
+ notes, including raw event streams and performance changes.
106
+
80
107
  ## Quick start
81
108
 
82
109
  Start Chrome or Chromium with remote debugging enabled, then obtain a page's
83
- `webSocketDebuggerUrl` from `http://localhost:9222/json`.
110
+ `webSocketDebuggerUrl` from `http://localhost:9222/json`. Launch with
111
+ `--remote-debugging-port=9222 --user-data-dir=<dedicated-profile-directory>`
112
+ and open a tab first. The scripts in [examples](examples) can launch Chrome
113
+ with these options for you, for example `uv run python examples/navigate.py`
114
+ from a development checkout.
84
115
 
85
116
  ```python
86
117
  import asyncio
@@ -88,18 +119,28 @@ import json
88
119
  from urllib.request import urlopen
89
120
 
90
121
  from cdpify import CdpClient
122
+ from cdpify.domains.page import LoadEventFiredEvent
91
123
 
92
124
 
93
125
  def get_websocket_url() -> str:
94
126
  with urlopen("http://localhost:9222/json", timeout=5) as response:
95
- return json.load(response)[0]["webSocketDebuggerUrl"]
127
+ return next(
128
+ target["webSocketDebuggerUrl"]
129
+ for target in json.load(response)
130
+ if target.get("type") == "page"
131
+ )
96
132
 
97
133
 
98
134
  async def main() -> None:
99
135
  ws_url = get_websocket_url()
100
136
 
101
137
  async with CdpClient(ws_url) as client:
102
- await client.page.navigate(url="https://example.com")
138
+ await client.page.enable()
139
+ async with client.listen(LoadEventFiredEvent) as loaded:
140
+ navigation = await client.page.navigate(url="https://example.com")
141
+ if navigation.error_text:
142
+ raise RuntimeError(navigation.error_text)
143
+ await loaded.next(timeout=10)
103
144
 
104
145
  result = await client.runtime.evaluate(
105
146
  expression="document.title",
@@ -196,6 +237,7 @@ triggers, subscribe first and then send the command:
196
237
  from cdpify.domains.page.events import LoadEventFiredEvent
197
238
 
198
239
 
240
+ await client.page.enable()
199
241
  async with client.listen(LoadEventFiredEvent) as events:
200
242
  await client.page.navigate(url="https://example.com")
201
243
  await events.next(timeout=10)
@@ -250,11 +292,15 @@ subscription has read or discarded the incoming event.
250
292
  ### Limiting buffered events
251
293
 
252
294
  Set `max_queue_size` on `CdpClient` to limit each listener's buffer. The default,
253
- `0`, is unlimited. A full buffer discards its oldest event so slow consumers do
254
- not block command responses. Override the limit for an individual subscription:
295
+ `0`, is unlimited. A bounded buffer defaults to `overflow="error"`: if it fills,
296
+ that subscription ends and its next read raises `CDPEventOverflowError`. Other
297
+ subscriptions and command responses continue normally. This makes event loss
298
+ explicit for protocols such as `Fetch.requestPaused` that require a response.
299
+
300
+ For a stream where loss is acceptable, select `overflow="drop_oldest"`:
255
301
 
256
302
  ```python
257
- client = CdpClient(ws_url, max_queue_size=256)
303
+ client = CdpClient(ws_url, max_queue_size=256, overflow="drop_oldest")
258
304
 
259
305
  async with client:
260
306
  async with client.listen(RequestWillBeSentEvent, max_queue_size=32) as events:
@@ -262,10 +308,26 @@ async with client:
262
308
  print(events.dropped_events)
263
309
  ```
264
310
 
265
- The same options apply to `listen_all()` and `CdpSession.listen()`. Passing `0`
266
- to a listener disables its limit. `events.dropped_events` counts events evicted
267
- by that listener's buffer. Disconnecting drains the remaining buffered events;
268
- `aclose()` releases them immediately.
311
+ The same options apply to `listen_all()`, `CdpSession.listen()` and raw streams.
312
+ Each listener can override both the limit and overflow policy. Passing `0`
313
+ disables its limit. `events.dropped_events` counts discarded events. Disconnect
314
+ drains healthy buffers; explicit closure and overflow errors release them.
315
+
316
+ ### Raw events
317
+
318
+ Use raw subscriptions for events outside the generated spec, or to inspect wire
319
+ parameter dictionaries without constructing typed models:
320
+
321
+ ```python
322
+ async with tab.listen_raw("Future.event") as events:
323
+ event = await events.next(timeout=5)
324
+ print(event.method, event.session_id, event.params)
325
+ ```
326
+
327
+ `client.listen_raw()` covers the root, `tab.listen_raw()` one session, and
328
+ `client.listen_all_raw()` every scope. Omitting the method matches every event
329
+ in that scope. Subscriptions register immediately and share the same lifetime,
330
+ buffering and read-only data rules as typed streams.
269
331
 
270
332
  ## Working with target sessions
271
333
 
@@ -324,9 +386,43 @@ client = CdpClient(
324
386
  max_frame_size=100 * 1024 * 1024,
325
387
  default_timeout=30.0,
326
388
  max_queue_size=256,
389
+ overflow="error",
390
+ compression=None,
391
+ open_timeout=10.0,
392
+ close_timeout=10.0,
327
393
  )
328
394
  ```
329
395
 
396
+ WebSocket compression is off by default to reduce local CPU work and latency.
397
+ Set `compression="deflate"` when saving network bandwidth is preferable.
398
+ `additional_headers`, `max_frame_size`, `compression`, `open_timeout` and
399
+ `close_timeout` configure the URL-based WebSocket transport. Supplied custom
400
+ transports own their connection settings.
401
+
402
+ ### Timeouts
403
+
404
+ `default_timeout` is a total command budget in seconds, including sending and
405
+ waiting for the response. It applies to root commands and session commands,
406
+ including custom transports. `None` disables the default.
407
+
408
+ For one call, or a group of calls, use Python's normal timeout context:
409
+
410
+ ```python
411
+ async with asyncio.timeout(2):
412
+ result = await client.runtime.evaluate(expression="1 + 1")
413
+ ```
414
+
415
+ A client deadline raises `CDPTimeoutError`; a shorter outer `asyncio.timeout()`
416
+ raises the built-in `TimeoutError`. Both release the pending local request.
417
+ Cancelling the wait does not automatically cancel work in Chrome.
418
+
419
+ CDP parameters retain the spec's units. For example, `Runtime.evaluate(timeout=...)`
420
+ limits execution inside Chrome in **milliseconds**; it is not the client budget.
421
+ The raw `execute()` escape hatch also accepts `timeout=seconds`: omit it to
422
+ inherit the client default or pass `None` to disable the deadline for that call.
423
+
424
+ ### Custom transports
425
+
330
426
  For another transport protocol, implement the exported `Transport` protocol
331
427
  and inject it directly:
332
428
 
@@ -342,8 +438,11 @@ WebSocket transport uses this path to avoid an intermediate event queue.
342
438
  Transports that implement only `Transport.events()` continue to work.
343
439
 
344
440
  When using `WebSocketTransport.events()` directly, its `max_queue_size` option
345
- sets the same drop-oldest limit on its transport buffer; `dropped_events` counts
346
- those evictions. A client-supplied custom transport manages its own buffer limits.
441
+ sets the limit on its transport buffer with the same overflow policies. A
442
+ client-supplied custom transport manages its own transport buffer limits.
443
+ `WebSocketTransport` has no default command timeout; standalone calls can pass
444
+ `execute(timeout=seconds)`. In the `Transport` contract, `timeout=None` means no
445
+ deadline and cancellation releases resources associated with that request.
347
446
 
348
447
  For methods not covered by the generated API, use the low-level escape hatch:
349
448
 
@@ -370,10 +469,35 @@ than `FrameId("F1")`, and `isinstance(frame_id, str)` for a runtime check.
370
469
 
371
470
  ### When Chrome deviates from the spec
372
471
 
373
- Chrome does not always send every field the protocol marks as required.
374
- Instead of failing, cdpify logs a warning on the `cdpify.codec` logger and
375
- sets the missing field to `None`, even if its type says otherwise. Unknown
376
- fields from newer Chrome versions are ignored.
472
+ Library error classes are available from `cdpify.error` and the root package:
473
+
474
+ ```python
475
+ from cdpify.error import CDPCommandError, CDPDecodeError
476
+ ```
477
+
478
+ Missing required fields raise `CDPDecodeError` with `model_type`,
479
+ `missing_fields` and the enclosing wire-field `path`. Unknown fields are ignored
480
+ and future enum values remain supported. Decoding checks required field
481
+ presence; it does not perform full schema validation of primitive values.
482
+
483
+ For a deliberately tolerant decode, use `decode_cdp(Model, payload, strict=False)`.
484
+ This fills missing required fields with `None` and logs a warning, including
485
+ nested models. When necessary, fetch the raw result with `execute()` and decode
486
+ it explicitly with this policy.
487
+
488
+ ### Omitted values and JSON null
489
+
490
+ Optional scalar parameters still use `None` to mean omitted. Optional `Any`
491
+ fields use `UNSET` because JSON null is itself a valid value:
492
+
493
+ ```python
494
+ from cdpify import UNSET, encode_cdp
495
+ from cdpify.domains.runtime import CallArgument
496
+
497
+ assert encode_cdp(CallArgument()) == {}
498
+ assert encode_cdp(CallArgument(value=None)) == {"value": None}
499
+ assert CallArgument().value is UNSET
500
+ ```
377
501
 
378
502
  Deprecated CDP commands still work but emit a `DeprecationWarning`. Use
379
503
  Python's warning filters to silence them or turn them into errors:
@@ -395,12 +519,38 @@ Install the project and its development dependencies with
395
519
  uv sync --dev
396
520
  uv run pytest
397
521
  uv run ruff check . --exclude cdpify/domains
522
+ uv run ruff format --check . --exclude cdpify/domains
523
+ uv run pyright
524
+ uv run python scripts/check_generated.py
398
525
  ```
399
526
 
400
527
  Use `uv sync --dev --extra orjson` and `uv run --extra orjson pytest` to include
401
528
  the optional backend. CI installs this extra and tests both JSON backends on
402
529
  Ubuntu, Windows, and macOS with Python 3.12, 3.13, and 3.14.
403
530
 
531
+ Run real Chrome coverage with `uv run --extra orjson pytest -m integration`.
532
+ These tests launch an isolated headless browser. Set `CHROME_PATH` to select its
533
+ executable. Integration tests are excluded from the default unit-test run.
534
+
535
+ CI also checks the complete library and a public API sample with Pyright,
536
+ verifies generated-code drift, and runs the integration suite against Chrome.
537
+ Regenerate from the bundled specs with `uv run python scripts/check_generated.py --write`.
538
+
539
+ Run reproducible microbenchmarks with:
540
+
541
+ ```bash
542
+ uv run python benchmarks/runtime.py
543
+ uv run --extra orjson python benchmarks/runtime.py --page-url ws://localhost:9222/devtools/page/...
544
+ ```
545
+
546
+ Output is JSON with environment metadata and timings for encoding, decoding,
547
+ typed calls and dispatch to several listener counts. An optional page endpoint
548
+ adds real small-message and 1-MiB round trips, including p50 and p95 latency.
549
+ The large case sends and receives a seeded Base64 payload. Add
550
+ `--compression deflate` to compare compression on the same machine; installing
551
+ or omitting the `orjson` extra selects the JSON backend. Timings are diagnostic
552
+ and are not used as flaky CI pass/fail thresholds.
553
+
404
554
  To download the latest protocol definitions and regenerate all domain clients:
405
555
 
406
556
  ```bash
@@ -410,9 +560,13 @@ uv run python -m cdpify.generator
410
560
  Generate only selected domains by repeating `--domain`:
411
561
 
412
562
  ```bash
413
- uv run python -m cdpify.generator --domain Page --domain Runtime
563
+ uv run python -m cdpify.generator --domain Page --domain Runtime --output-dir build/selected-domains
414
564
  ```
415
565
 
566
+ Generation replaces the entire output directory, including for selected domains.
567
+ Use a separate `--output-dir` for partial generation to keep the full bundled
568
+ client intact. Selected domains may also reference types from other domains.
569
+
416
570
  Use `--spec-dir` and `--output-dir` to override where downloaded specifications
417
571
  and generated modules are written.
418
572
 
@@ -425,6 +579,8 @@ once a week and opens a pull request when generated code changes.
425
579
  - [Chrome DevTools Protocol documentation](https://chromedevtools.github.io/devtools-protocol/)
426
580
  - [Chrome DevTools Protocol repository](https://github.com/ChromeDevTools/devtools-protocol)
427
581
  - [Examples](examples)
582
+ - [Changelog and migration notes](CHANGELOG.md)
583
+ - [Release checklist](RELEASING.md)
428
584
 
429
585
  The code-generation approach was inspired by
430
586
  [`cdp-use`](https://github.com/browser-use/cdp-use).