You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pulsar.apache.org by mm...@apache.org on 2022/04/10 15:40:47 UTC

[pulsar] branch master updated: Generate python doc for 2.10.0 (#15096)

This is an automated email from the ASF dual-hosted git repository.

mmerli pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/pulsar.git


The following commit(s) were added to refs/heads/master by this push:
     new ee9e2cb2b1c Generate python doc for 2.10.0 (#15096)
ee9e2cb2b1c is described below

commit ee9e2cb2b1c49169b62a244977ddae6286b0f560
Author: lipenghui <pe...@apache.org>
AuthorDate: Sun Apr 10 23:40:41 2022 +0800

    Generate python doc for 2.10.0 (#15096)
---
 site2/website/static/api/python/2.10.0/index.html  |    7 +
 site2/website/static/api/python/2.10.0/pulsar.html | 6237 ++++++++++++++++++++
 .../api/python/2.10.0/pulsar/exceptions.html       |  260 +
 .../static/api/python/2.10.0/pulsar/functions.html |  259 +
 .../python/2.10.0/pulsar/functions/context.html    | 1384 +++++
 .../python/2.10.0/pulsar/functions/function.html   |  376 ++
 .../api/python/2.10.0/pulsar/functions/serde.html  |  665 +++
 .../static/api/python/2.10.0/pulsar/schema.html    |  262 +
 .../python/2.10.0/pulsar/schema/definition.html    | 3274 ++++++++++
 .../api/python/2.10.0/pulsar/schema/schema.html    |  841 +++
 .../python/2.10.0/pulsar/schema/schema_avro.html   |  527 ++
 site2/website/static/api/python/2.10.0/search.js   |   46 +
 12 files changed, 14138 insertions(+)

diff --git a/site2/website/static/api/python/2.10.0/index.html b/site2/website/static/api/python/2.10.0/index.html
new file mode 100644
index 00000000000..c13d629ab48
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/index.html
@@ -0,0 +1,7 @@
+<!doctype html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="refresh" content="0; url=./pulsar.html"/>
+</head>
+</html>
diff --git a/site2/website/static/api/python/2.10.0/pulsar.html b/site2/website/static/api/python/2.10.0/pulsar.html
new file mode 100644
index 00000000000..b8213c9b0f8
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar.html
@@ -0,0 +1,6237 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+        <h2>Contents</h2>
+        <ul>
+  <li><a href="#install-from-pypi">Install from PyPI</a></li>
+  <li><a href="#install-from-sources">Install from sources</a></li>
+  <li><a href="#examples">Examples</a></li>
+</ul>
+
+
+        <h2>Submodules</h2>
+        <ul>
+                <li><a href="pulsar/exceptions.html">pulsar.exceptions</a></li>
+                <li><a href="pulsar/functions.html">pulsar.functions</a></li>
+                <li><a href="pulsar/schema.html">pulsar.schema</a></li>
+        </ul>
+
+        <h2>API Documentation</h2>
+            <ul class="memberlist">
+            <li>
+                    <a class="class" href="#MessageId">MessageId</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#MessageId.__init__">MessageId</a>
+                        </li>
+                        <li>
+                                <a class="variable" href="#MessageId.earliest">earliest</a>
+                        </li>
+                        <li>
+                                <a class="variable" href="#MessageId.latest">latest</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageId.ledger_id">ledger_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageId.entry_id">entry_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageId.batch_index">batch_index</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageId.partition">partition</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageId.serialize">serialize</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageId.deserialize">deserialize</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Message">Message</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Message.__init__">Message</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.data">data</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.value">value</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.properties">properties</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.partition_key">partition_key</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.publish_timestamp">publish_timestamp</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.event_timestamp">event_timestamp</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.message_id">message_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.topic_name">topic_name</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.redelivery_count">redelivery_count</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Message.schema_version">schema_version</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#MessageBatch">MessageBatch</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#MessageBatch.__init__">MessageBatch</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageBatch.with_message_id">with_message_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#MessageBatch.parse_from">parse_from</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Authentication">Authentication</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Authentication.__init__">Authentication</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#AuthenticationTLS">AuthenticationTLS</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#AuthenticationTLS.__init__">AuthenticationTLS</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#AuthenticationToken">AuthenticationToken</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#AuthenticationToken.__init__">AuthenticationToken</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#AuthenticationAthenz">AuthenticationAthenz</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#AuthenticationAthenz.__init__">AuthenticationAthenz</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#AuthenticationOauth2">AuthenticationOauth2</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#AuthenticationOauth2.__init__">AuthenticationOauth2</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Client">Client</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Client.__init__">Client</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Client.create_producer">create_producer</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Client.subscribe">subscribe</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Client.create_reader">create_reader</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Client.get_topic_partitions">get_topic_partitions</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Client.shutdown">shutdown</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Client.close">close</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Producer">Producer</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Producer.__init__">Producer</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.topic">topic</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.producer_name">producer_name</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.last_sequence_id">last_sequence_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.send">send</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.send_async">send_async</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.flush">flush</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.close">close</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Producer.is_connected">is_connected</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Consumer">Consumer</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Consumer.__init__">Consumer</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.topic">topic</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.subscription_name">subscription_name</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.unsubscribe">unsubscribe</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.receive">receive</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.acknowledge">acknowledge</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.acknowledge_cumulative">acknowledge_cumulative</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.negative_acknowledge">negative_acknowledge</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.pause_message_listener">pause_message_listener</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.resume_message_listener">resume_message_listener</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.redeliver_unacknowledged_messages">redeliver_unacknowledged_messages</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.seek">seek</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.close">close</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Consumer.is_connected">is_connected</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Reader">Reader</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Reader.__init__">Reader</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Reader.topic">topic</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Reader.read_next">read_next</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Reader.has_message_available">has_message_available</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Reader.seek">seek</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Reader.close">close</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Reader.is_connected">is_connected</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#CryptoKeyReader">CryptoKeyReader</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#CryptoKeyReader.__init__">CryptoKeyReader</a>
+                        </li>
+                </ul>
+
+            </li>
+    </ul>
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+pulsar    </h1>
+
+                        <div class="docstring"><p>The Pulsar Python client library is based on the existing C++ client library.
+All the same features are exposed through the Python interface.</p>
+
+<p>Currently, the supported Python versions are 2.7, 3.5, 3.6, 3.7 and 3.8.</p>
+
+<h2 id="install-from-pypi">Install from PyPI</h2>
+
+<p>Download Python wheel binary files for MacOS and Linux
+directly from the PyPI archive.</p>
+
+<pre><code>#!shell
+$ sudo pip install pulsar-client
+</code></pre>
+
+<h2 id="install-from-sources">Install from sources</h2>
+
+<p>Follow the instructions to compile the Pulsar C++ client library. This method
+will also build the Python binding for the library.</p>
+
+<p>To install the Python bindings:</p>
+
+<pre><code>#!shell
+$ cd pulsar-client-cpp/python
+$ sudo python setup.py install
+</code></pre>
+
+<h2 id="examples">Examples</h2>
+
+<h3 id="producerpulsarproducer-example"><a href="#<a href="#Producer">pulsar.Producer</a>">Producer</a> example</h3>
+
+<pre><code>#!python
+import pulsar
+
+client = <a href="#Client">pulsar.Client</a>('pulsar://localhost:6650')
+
+producer = client.create_producer('my-topic')
+
+for i in range(10):
+    producer.send(('Hello-%d' % i).encode('utf-8'))
+
+client.close()
+</code></pre>
+
+<h4 id="consumerpulsarconsumer-example"><a href="#<a href="#Consumer">pulsar.Consumer</a>">Consumer</a> Example</h4>
+
+<pre><code>#!python
+import pulsar
+
+client = <a href="#Client">pulsar.Client</a>('pulsar://localhost:6650')
+consumer = client.subscribe('my-topic', 'my-subscription')
+
+while True:
+    msg = consumer.receive()
+    try:
+        print("Received message '%s' id='%s'", msg.data().decode('utf-8'), msg.message_id())
+        consumer.acknowledge(msg)
+    except:
+        consumer.negative_acknowledge(msg)
+
+client.close()
+</code></pre>
+
+<h3 id="async-producerpulsarproducersend_async-example"><a href="#<a href="#Producer.send_async">pulsar.Producer.send_async</a>">Async producer</a> example</h3>
+
+<pre><code>#!python
+import pulsar
+
+client = <a href="#Client">pulsar.Client</a>('pulsar://localhost:6650')
+
+producer = client.create_producer(
+                'my-topic',
+                block_if_queue_full=True,
+                batching_enabled=True,
+                batching_max_publish_delay_ms=10
+            )
+
+def send_callback(res, msg_id):
+    print('Message published res=%s', res)
+
+while True:
+    producer.send_async(('Hello-%d' % i).encode('utf-8'), send_callback)
+
+client.close()
+</code></pre>
+</div>
+
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">The Pulsar Python client library is based on the existing C++ client library.</span>
+<span class="sd">All the same features are exposed through the Python interface.</span>
+
+<span class="sd">Currently, the supported Python versions are 2.7, 3.5, 3.6, 3.7 and 3.8.</span>
+
+<span class="sd">## Install from PyPI</span>
+
+<span class="sd">Download Python wheel binary files for MacOS and Linux</span>
+<span class="sd">directly from the PyPI archive.</span>
+
+<span class="sd">    #!shell</span>
+<span class="sd">    $ sudo pip install pulsar-client</span>
+
+<span class="sd">## Install from sources</span>
+
+<span class="sd">Follow the instructions to compile the Pulsar C++ client library. This method</span>
+<span class="sd">will also build the Python binding for the library.</span>
+
+<span class="sd">To install the Python bindings:</span>
+
+<span class="sd">    #!shell</span>
+<span class="sd">    $ cd pulsar-client-cpp/python</span>
+<span class="sd">    $ sudo python setup.py install</span>
+
+<span class="sd">## Examples</span>
+
+<span class="sd">### [Producer](#pulsar.Producer) example</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    import pulsar</span>
+
+<span class="sd">    client = pulsar.Client(&#39;pulsar://localhost:6650&#39;)</span>
+
+<span class="sd">    producer = client.create_producer(&#39;my-topic&#39;)</span>
+
+<span class="sd">    for i in range(10):</span>
+<span class="sd">        producer.send((&#39;Hello-%d&#39; % i).encode(&#39;utf-8&#39;))</span>
+
+<span class="sd">    client.close()</span>
+
+<span class="sd">#### [Consumer](#pulsar.Consumer) Example</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    import pulsar</span>
+
+<span class="sd">    client = pulsar.Client(&#39;pulsar://localhost:6650&#39;)</span>
+<span class="sd">    consumer = client.subscribe(&#39;my-topic&#39;, &#39;my-subscription&#39;)</span>
+
+<span class="sd">    while True:</span>
+<span class="sd">        msg = consumer.receive()</span>
+<span class="sd">        try:</span>
+<span class="sd">            print(&quot;Received message &#39;%s&#39; id=&#39;%s&#39;&quot;, msg.data().decode(&#39;utf-8&#39;), msg.message_id())</span>
+<span class="sd">            consumer.acknowledge(msg)</span>
+<span class="sd">        except:</span>
+<span class="sd">            consumer.negative_acknowledge(msg)</span>
+
+<span class="sd">    client.close()</span>
+
+<span class="sd">### [Async producer](#pulsar.Producer.send_async) example</span>
+
+<span class="sd">    #!python</span>
+<span class="sd">    import pulsar</span>
+
+<span class="sd">    client = pulsar.Client(&#39;pulsar://localhost:6650&#39;)</span>
+
+<span class="sd">    producer = client.create_producer(</span>
+<span class="sd">                    &#39;my-topic&#39;,</span>
+<span class="sd">                    block_if_queue_full=True,</span>
+<span class="sd">                    batching_enabled=True,</span>
+<span class="sd">                    batching_max_publish_delay_ms=10</span>
+<span class="sd">                )</span>
+
+<span class="sd">    def send_callback(res, msg_id):</span>
+<span class="sd">        print(&#39;Message published res=%s&#39;, res)</span>
+
+<span class="sd">    while True:</span>
+<span class="sd">        producer.send_async((&#39;Hello-%d&#39; % i).encode(&#39;utf-8&#39;), send_callback)</span>
+
+<span class="sd">    client.close()</span>
+<span class="sd">&quot;&quot;&quot;</span>
+
+<span class="kn">import</span> <span class="nn">logging</span>
+<span class="kn">import</span> <span class="nn">_pulsar</span>
+
+<span class="kn">from</span> <span class="nn">_pulsar</span> <span class="kn">import</span> <span class="n">Result</span><span class="p">,</span> <span class="n">CompressionType</span><span class="p">,</span> <span class="n">ConsumerType</span><span class="p">,</span> <span class="n">InitialPosition</span><span class="p">,</span> <span class="n">PartitionsRoutingMode</span><span class="p">,</span> <span class="n">BatchingType</span>  <span class="c1"># noqa: F401</span>
+
+<span class="kn">from</span> <span class="nn">pulsar.exceptions</span> <span class="kn">import</span> <span class="o">*</span>
+
+<span class="kn">from</span> <span class="nn">pulsar.functions.function</span> <span class="kn">import</span> <span class="n">Function</span>
+<span class="kn">from</span> <span class="nn">pulsar.functions.context</span> <span class="kn">import</span> <span class="n">Context</span>
+<span class="kn">from</span> <span class="nn">pulsar.functions.serde</span> <span class="kn">import</span> <span class="n">SerDe</span><span class="p">,</span> <span class="n">IdentitySerDe</span><span class="p">,</span> <span class="n">PickleSerDe</span>
+<span class="kn">from</span> <span class="nn">pulsar</span> <span class="kn">import</span> <span class="n">schema</span>
+<span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+
+<span class="kn">import</span> <span class="nn">re</span>
+<span class="n">_retype</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s1">&#39;x&#39;</span><span class="p">))</span>
+
+<span class="kn">import</span> <span class="nn">certifi</span>
+<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">timedelta</span>
+
+
+<span class="k">class</span> <span class="nc">MessageId</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Represents a message id</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partition</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">ledger_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">entry_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">batch_index</spa [...]
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">(</span><span class="n">partition</span><span class="p">,</span> <span class="n">ledger_id</span><span class="p">,</span> <span class="n">entry_id</span><span class="p">,</span> <span class="n">batch_index</span><span class="p">)</span>
+
+    <span class="s1">&#39;Represents the earliest message stored in a topic&#39;</span>
+    <span class="n">earliest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">earliest</span>
+
+    <span class="s1">&#39;Represents the latest message published on a topic&#39;</span>
+    <span class="n">latest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">latest</span>
+
+    <span class="k">def</span> <span class="nf">ledger_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">ledger_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">entry_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">entry_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">batch_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">batch_index</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">partition</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns a bytes representation of the message id.</span>
+<span class="sd">        This bytes sequence can be stored and later deserialized.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">serialize</span><span class="p">()</span>
+
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Deserialize a message id object from a previously</span>
+<span class="sd">        serialized bytes sequence.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">Message</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Message objects are returned by a consumer, either by calling `receive` or</span>
+<span class="sd">    through a listener.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns object typed bytes with the payload of the message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns object with the de-serialized version of the message content</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
+
+    <span class="k">def</span> <span class="nf">properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the properties attached to the message. Properties are</span>
+<span class="sd">        application-defined key/value pairs that will be attached to the</span>
+<span class="sd">        message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">properties</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the partitioning key for the message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">partition_key</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">publish_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the timestamp in milliseconds with the message publish time.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">publish_timestamp</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">event_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the timestamp in milliseconds with the message event time.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        The message ID that can be used to refere to this particular message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">message_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the topic Name from which this message originated from</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">topic_name</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">redelivery_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the redelivery count for this message</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">redelivery_count</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">schema_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the schema version for this message</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">schema_version</span><span class="p">()</span>
+
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span> <span class="nf">_wrap</span><span class="p">(</span><span class="n">_message</span><span class="p">):</span>
+        <span class="bp">self</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">_message</span>
+        <span class="k">return</span> <span class="bp">self</span>
+
+
+<span class="k">class</span> <span class="nc">MessageBatch</span><span class="p">:</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBatch</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">with_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg_id</span><span class="p">):</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">):</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">MessageId</span><span class="p">):</span>
+                <span class="n">msg_id</span> <span class="o">=</span> <span class="n">msg_id</span><span class="o">.</span><span class="n">_msg_id</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;unknown message id type&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">with_message_id</span><span class="p">(</span><span class="n">msg_id</span><span class="p">)</span>
+        <span class="k">return</span> <span class="bp">self</span>
+
+    <span class="k">def</span> <span class="nf">parse_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">parse_from</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+        <span class="n">_msgs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">messages</span><span class="p">()</span>
+        <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">Message</span><span class="o">.</span><span class="n">_wrap</span><span class="p">,</span> <span class="n">_msgs</span><span class="p">))</span>
+
+
+<span class="k">class</span> <span class="nc">Authentication</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Authentication provider object. Used to load authentication from an external</span>
+<span class="sd">    shared library.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `dynamicLibPath`: Path to the authentication provider shared library</span>
+<span class="sd">          (such as `tls.so`)</span>
+<span class="sd">        * `authParamsString`: Comma-separated list of provider-specific</span>
+<span class="sd">          configuration params</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="s1">&#39;dynamicLibPath&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">,</span> <span class="s1">&#39;authParamsString&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Authentication</span><span class="p">(</span><span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">AuthenticationTLS</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    TLS Authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the TLS authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `certificatePath`: Path to the public certificate</span>
+<span class="sd">        * `privateKeyPath`: Path to private TLS key</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="s1">&#39;certificate_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">&#39;private_key_path&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationTLS</span><span class="p">(</span><span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">AuthenticationToken</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Token based authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the token authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `token`: A string containing the token or a functions that provides a</span>
+<span class="sd">                   string with the token</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">callable</span><span class="p">(</span><span class="n">token</span><span class="p">)):</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument token is expected to be of type &#39;str&#39; or a function returning &#39;str&#39;&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationToken</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">AuthenticationAthenz</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Athenz Authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the Athenz authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `auth_params_string`: JSON encoded configuration for Athenz client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">&#39;auth_params_string&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationAthenz</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">AuthenticationOauth2</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Oauth2 Authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the Oauth2 authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `auth_params_string`: JSON encoded configuration for Oauth2 client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">&#39;auth_params_string&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationOauth2</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">Client</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    The Pulsar client. A single client instance can be used to create producers</span>
+<span class="sd">    and consumers on multiple topics.</span>
+
+<span class="sd">    The client will share the same connection pool and threads across all</span>
+<span class="sd">    producers and consumers.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span>
+                 <span class="n">authentication</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">operation_timeout_seconds</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
+                 <span class="n">io_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">message_listener_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">concurrent_lookup_requests</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                 <span class="n">log_conf_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">use_tls</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">tls_trust_certs_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">tls_allow_insecure_connection</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">tls_validate_hostname</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">connection_timeout_ms</span><span class="o">=</span><span class="mi">10000</span><span class="p">,</span>
+                 <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a new Pulsar client instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `service_url`: The Pulsar service url eg: pulsar://my-broker.com:6650/</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `authentication`:</span>
+<span class="sd">          Set the authentication provider to be used with the broker. For example:</span>
+<span class="sd">          `AuthenticationTls`, AuthenticaionToken, `AuthenticationAthenz`or `AuthenticationOauth2`</span>
+<span class="sd">        * `operation_timeout_seconds`:</span>
+<span class="sd">          Set timeout on client operations (subscribe, create producer, close,</span>
+<span class="sd">          unsubscribe).</span>
+<span class="sd">        * `io_threads`:</span>
+<span class="sd">          Set the number of IO threads to be used by the Pulsar client.</span>
+<span class="sd">        * `message_listener_threads`:</span>
+<span class="sd">          Set the number of threads to be used by the Pulsar client when</span>
+<span class="sd">          delivering messages through message listener. The default is 1 thread</span>
+<span class="sd">          per Pulsar client. If using more than 1 thread, messages for distinct</span>
+<span class="sd">          `message_listener`s will be delivered in different threads, however a</span>
+<span class="sd">          single `MessageListener` will always be assigned to the same thread.</span>
+<span class="sd">        * `concurrent_lookup_requests`:</span>
+<span class="sd">          Number of concurrent lookup-requests allowed on each broker connection</span>
+<span class="sd">          to prevent overload on the broker.</span>
+<span class="sd">        * `log_conf_file_path`:</span>
+<span class="sd">          Initialize log4cxx from a configuration file.</span>
+<span class="sd">        * `use_tls`:</span>
+<span class="sd">          Configure whether to use TLS encryption on the connection. This setting</span>
+<span class="sd">          is deprecated. TLS will be automatically enabled if the `serviceUrl` is</span>
+<span class="sd">          set to `pulsar+ssl://` or `https://`</span>
+<span class="sd">        * `tls_trust_certs_file_path`:</span>
+<span class="sd">          Set the path to the trusted TLS certificate file. If empty defaults to</span>
+<span class="sd">          certifi.</span>
+<span class="sd">        * `tls_allow_insecure_connection`:</span>
+<span class="sd">          Configure whether the Pulsar client accepts untrusted TLS certificates</span>
+<span class="sd">          from the broker.</span>
+<span class="sd">        * `tls_validate_hostname`:</span>
+<span class="sd">          Configure whether the Pulsar client validates that the hostname of the</span>
+<span class="sd">          endpoint, matches the common name on the TLS certificate presented by</span>
+<span class="sd">          the endpoint.</span>
+<span class="sd">        * `logger`:</span>
+<span class="sd">          Set a Python logger for this Pulsar client. Should be an instance of `logging.Logger`.</span>
+<span class="sd">        * `connection_timeout_ms`:</span>
+<span class="sd">          Set timeout in milliseconds on TCP connections.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span> <span class="s1">&#39;service_url&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">Authentication</span><span class="p">,</span> <span class="n">authentication</span><span class="p">,</span> <span class="s1">&#39;authentication&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">operation_timeout_seconds</span><span class="p">,</span> <span class="s1">&#39;operation_timeout_seconds&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">connection_timeout_ms</span><span class="p">,</span> <span class="s1">&#39;connection_timeout_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">io_threads</span><span class="p">,</span> <span class="s1">&#39;io_threads&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">message_listener_threads</span><span class="p">,</span> <span class="s1">&#39;message_listener_threads&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">concurrent_lookup_requests</span><span class="p">,</span> <span class="s1">&#39;concurrent_lookup_requests&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">log_conf_file_path</span><span class="p">,</span> <span class="s1">&#39;log_conf_file_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">use_tls</span><span class="p">,</span> <span class="s1">&#39;use_tls&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">tls_trust_certs_file_path</span><span class="p">,</span> <span class="s1">&#39;tls_trust_certs_file_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_allow_insecure_connection</span><span class="p">,</span> <span class="s1">&#39;tls_allow_insecure_connection&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_validate_hostname</span><span class="p">,</span> <span class="s1">&#39;tls_validate_hostname&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Logger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="s1">&#39;logger&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ClientConfiguration</span><span class="p">()</span>
+        <span class="k">if</span> <span class="n">authentication</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">authentication</span><span class="p">(</span><span class="n">authentication</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">operation_timeout_seconds</span><span class="p">(</span><span class="n">operation_timeout_seconds</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">connection_timeout</span><span class="p">(</span><span class="n">connection_timeout_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">io_threads</span><span class="p">(</span><span class="n">io_threads</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">message_listener_threads</span><span class="p">(</span><span class="n">message_listener_threads</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">concurrent_lookup_requests</span><span class="p">(</span><span class="n">concurrent_lookup_requests</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">log_conf_file_path</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">log_conf_file_path</span><span class="p">(</span><span class="n">log_conf_file_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">logger</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">set_logger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">use_tls</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;pulsar+ssl://&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://&#39;</span><span class="p">):</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">use_tls</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">tls_trust_certs_file_path</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">tls_trust_certs_file_path</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">certifi</span><span class="o">.</span><span class="n">where</span><span class="p">())</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">tls_allow_insecure_connection</span><span class="p">(</span><span class="n">tls_allow_insecure_connection</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">tls_validate_hostname</span><span class="p">(</span><span class="n">tls_validate_hostname</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">service_url</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span> <span class="o">=</span> <span class="p">[]</span>
+
+    <span class="k">def</span> <span class="nf">create_producer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span>
+                        <span class="n">producer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                        <span class="n">initial_sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">send_timeout_millis</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+                        <span class="n">compression_type</span><span class="o">=</span><span class="n">CompressionType</span><span class="o">.</span><span class="n">NONE</span><span class="p">,</span>
+                        <span class="n">max_pending_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                        <span class="n">max_pending_messages_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                        <span class="n">block_if_queue_full</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">batching_enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">batching_max_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                        <span class="n">batching_max_allowed_size_in_bytes</span><span class="o">=</span><span class="mi">128</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span>
+                        <span class="n">batching_max_publish_delay_ms</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
+                        <span class="n">message_routing_mode</span><span class="o">=</span><span class="n">PartitionsRoutingMode</span><span class="o">.</span><span class="n">RoundRobinDistribution</span><span class="p">,</span>
+                        <span class="n">lazy_start_partitioned_producers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">batching_type</span><span class="o">=</span><span class="n">BatchingType</span><span class="o">.</span><span class="n">Default</span><span class="p">,</span>
+                        <span class="n">encryption_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+                        <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a new producer on a given topic.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`:</span>
+<span class="sd">          The topic name</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `producer_name`:</span>
+<span class="sd">           Specify a name for the producer. If not assigned,</span>
+<span class="sd">           the system will generate a globally unique name which can be accessed</span>
+<span class="sd">           with `Producer.producer_name()`. When specifying a name, it is app to</span>
+<span class="sd">           the user to ensure that, for a given topic, the producer name is unique</span>
+<span class="sd">           across all Pulsar&#39;s clusters.</span>
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be published by this producer.</span>
+<span class="sd">           The schema will be used for two purposes:</span>
+<span class="sd">             - Validate the data format against the topic defined schema</span>
+<span class="sd">             - Perform serialization/deserialization between data and objects</span>
+<span class="sd">           An example for this parameter would be to pass `schema=JsonSchema(MyRecordClass)`.</span>
+<span class="sd">        * `initial_sequence_id`:</span>
+<span class="sd">           Set the baseline for the sequence ids for messages</span>
+<span class="sd">           published by the producer. First message will be using</span>
+<span class="sd">           `(initialSequenceId + 1)`` as its sequence id and subsequent messages will</span>
+<span class="sd">           be assigned incremental sequence ids, if not otherwise specified.</span>
+<span class="sd">        * `send_timeout_millis`:</span>
+<span class="sd">          If a message is not acknowledged by the server before the</span>
+<span class="sd">          `send_timeout` expires, an error will be reported.</span>
+<span class="sd">        * `compression_type`:</span>
+<span class="sd">          Set the compression type for the producer. By default, message</span>
+<span class="sd">          payloads are not compressed. Supported compression types are</span>
+<span class="sd">          `CompressionType.LZ4`, `CompressionType.ZLib`, `CompressionType.ZSTD` and `CompressionType.SNAPPY`.</span>
+<span class="sd">          ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that</span>
+<span class="sd">          release in order to be able to receive messages compressed with ZSTD.</span>
+<span class="sd">          SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that</span>
+<span class="sd">          release in order to be able to receive messages compressed with SNAPPY.</span>
+<span class="sd">        * `max_pending_messages`:</span>
+<span class="sd">          Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd">          an acknowledgment from the broker.</span>
+<span class="sd">        * `max_pending_messages_across_partitions`:</span>
+<span class="sd">          Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd">          an acknowledgment across partitions from the broker.</span>
+<span class="sd">        * `block_if_queue_full`: Set whether `send_async` operations should</span>
+<span class="sd">          block when the outgoing message queue is full.</span>
+<span class="sd">        * `message_routing_mode`:</span>
+<span class="sd">          Set the message routing mode for the partitioned producer. Default is `PartitionsRoutingMode.RoundRobinDistribution`,</span>
+<span class="sd">          other option is `PartitionsRoutingMode.UseSinglePartition`</span>
+<span class="sd">        * `lazy_start_partitioned_producers`:</span>
+<span class="sd">          This config affects producers of partitioned topics only. It controls whether</span>
+<span class="sd">          producers register and connect immediately to the owner broker of each partition</span>
+<span class="sd">          or start lazily on demand. The internal producer of one partition is always</span>
+<span class="sd">          started eagerly, chosen by the routing policy, but the internal producers of</span>
+<span class="sd">          any additional partitions are started on demand, upon receiving their first</span>
+<span class="sd">          message.</span>
+<span class="sd">          Using this mode can reduce the strain on brokers for topics with large numbers of</span>
+<span class="sd">          partitions and when the SinglePartition routing policy is used without keyed messages.</span>
+<span class="sd">          Because producer connection can be on demand, this can produce extra send latency</span>
+<span class="sd">          for the first messages of a given partition.</span>
+<span class="sd">        * `properties`:</span>
+<span class="sd">          Sets the properties for the producer. The properties associated with a producer</span>
+<span class="sd">          can be used for identify a producer at broker side.</span>
+<span class="sd">        * `batching_type`:</span>
+<span class="sd">          Sets the batching type for the producer.</span>
+<span class="sd">          There are two batching type: DefaultBatching and KeyBasedBatching.</span>
+<span class="sd">            - Default batching</span>
+<span class="sd">            incoming single messages:</span>
+<span class="sd">            (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd">            batched into single batch message:</span>
+<span class="sd">            [(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</span>
+
+<span class="sd">            - KeyBasedBatching</span>
+<span class="sd">            incoming single messages:</span>
+<span class="sd">            (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd">            batched into single batch message:</span>
+<span class="sd">            [(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</span>
+<span class="sd">        * encryption_key:</span>
+<span class="sd">           The key used for symmetric encryption, configured on the producer side</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">producer_name</span><span class="p">,</span> <span class="s1">&#39;producer_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">initial_sequence_id</span><span class="p">,</span> <span class="s1">&#39;initial_sequence_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">send_timeout_millis</span><span class="p">,</span> <span class="s1">&#39;send_timeout_millis&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">CompressionType</span><span class="p">,</span> <span class="n">compression_type</span><span class="p">,</span> <span class="s1">&#39;compression_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages</span><span class="p">,</span> <span class="s1">&#39;max_pending_messages&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages_across_partitions</span><span class="p">,</span> <span class="s1">&#39;max_pending_messages_across_partitions&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">block_if_queue_full</span><span class="p">,</span> <span class="s1">&#39;block_if_queue_full&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">batching_enabled</span><span class="p">,</span> <span class="s1">&#39;batching_enabled&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_messages</span><span class="p">,</span> <span class="s1">&#39;batching_max_messages&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_allowed_size_in_bytes</span><span class="p">,</span> <span class="s1">&#39;batching_max_allowed_size_in_bytes&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_publish_delay_ms</span><span class="p">,</span> <span class="s1">&#39;batching_max_publish_delay_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">BatchingType</span><span class="p">,</span> <span class="n">batching_type</span><span class="p">,</span> <span class="s1">&#39;batching_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">encryption_key</span><span class="p">,</span> <span class="s1">&#39;encryption_key&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">lazy_start_partitioned_producers</span><span class="p">,</span> <span class="s1">&#39;lazy_start_partitioned_producers&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ProducerConfiguration</span><span class="p">()</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">send_timeout_millis</span><span class="p">(</span><span class="n">send_timeout_millis</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">compression_type</span><span class="p">(</span><span class="n">compression_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages</span><span class="p">(</span><span class="n">max_pending_messages</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages_across_partitions</span><span class="p">(</span><span class="n">max_pending_messages_across_partitions</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">block_if_queue_full</span><span class="p">(</span><span class="n">block_if_queue_full</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_enabled</span><span class="p">(</span><span class="n">batching_enabled</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_messages</span><span class="p">(</span><span class="n">batching_max_messages</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">(</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_publish_delay_ms</span><span class="p">(</span><span class="n">batching_max_publish_delay_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">partitions_routing_mode</span><span class="p">(</span><span class="n">message_routing_mode</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_type</span><span class="p">(</span><span class="n">batching_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">lazy_start_partitioned_producers</span><span class="p">(</span><span class="n">lazy_start_partitioned_producers</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">producer_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">producer_name</span><span class="p">(</span><span class="n">producer_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">initial_sequence_id</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">initial_sequence_id</span><span class="p">(</span><span class="n">initial_sequence_id</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+        <span class="k">if</span> <span class="n">encryption_key</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">encryption_key</span><span class="p">(</span><span class="n">encryption_key</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">p</span> <span class="o">=</span> <span class="n">Producer</span><span class="p">()</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_producer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_producer</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span>
+        <span class="k">return</span> <span class="n">p</span>
+
+    <span class="k">def</span> <span class="nf">subscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span>
+                  <span class="n">consumer_type</span><span class="o">=</span><span class="n">ConsumerType</span><span class="o">.</span><span class="n">Exclusive</span><span class="p">,</span>
+                  <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                  <span class="n">message_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                  <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                  <span class="n">consumer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">unacked_messages_timeout_ms</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">broker_consumer_stats_cache_time_ms</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+                  <span class="n">negative_ack_redelivery_delay_ms</span><span class="o">=</span><span class="mi">60000</span><span class="p">,</span>
+                  <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                  <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">pattern_auto_discovery_period</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+                  <span class="n">initial_position</span><span class="o">=</span><span class="n">InitialPosition</span><span class="o">.</span><span class="n">Latest</span><span class="p">,</span>
+                  <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">replicate_subscription_state_enabled</span><span class="o">=</span><span class="kc">False</span>
+                  <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Subscribe to the given topic and subscription combination.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`: The name of the topic, list of topics or regex pattern.</span>
+<span class="sd">                  This method will accept these forms:</span>
+<span class="sd">                    - `topic=&#39;my-topic&#39;`</span>
+<span class="sd">                    - `topic=[&#39;topic-1&#39;, &#39;topic-2&#39;, &#39;topic-3&#39;]`</span>
+<span class="sd">                    - `topic=re.compile(&#39;persistent://public/default/topic-*&#39;)`</span>
+<span class="sd">        * `subscription`: The name of the subscription.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `consumer_type`:</span>
+<span class="sd">          Select the subscription type to be used when subscribing to the topic.</span>
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be received by this consumer.</span>
+<span class="sd">        * `message_listener`:</span>
+<span class="sd">          Sets a message listener for the consumer. When the listener is set,</span>
+<span class="sd">          the application will receive messages through it. Calls to</span>
+<span class="sd">          `consumer.receive()` will not be allowed. The listener function needs</span>
+<span class="sd">          to accept (consumer, message), for example:</span>
+
+<span class="sd">                #!python</span>
+<span class="sd">                def my_listener(consumer, message):</span>
+<span class="sd">                    # process message</span>
+<span class="sd">                    consumer.acknowledge(message)</span>
+
+<span class="sd">        * `receiver_queue_size`:</span>
+<span class="sd">          Sets the size of the consumer receive queue. The consumer receive</span>
+<span class="sd">          queue controls how many messages can be accumulated by the consumer</span>
+<span class="sd">          before the application calls `receive()`. Using a higher value could</span>
+<span class="sd">          potentially increase the consumer throughput at the expense of higher</span>
+<span class="sd">          memory utilization. Setting the consumer queue size to zero decreases</span>
+<span class="sd">          the throughput of the consumer by disabling pre-fetching of messages.</span>
+<span class="sd">          This approach improves the message distribution on shared subscription</span>
+<span class="sd">          by pushing messages only to those consumers that are ready to process</span>
+<span class="sd">          them. Neither receive with timeout nor partitioned topics can be used</span>
+<span class="sd">          if the consumer queue size is zero. The `receive()` function call</span>
+<span class="sd">          should not be interrupted when the consumer queue size is zero. The</span>
+<span class="sd">          default value is 1000 messages and should work well for most use</span>
+<span class="sd">          cases.</span>
+<span class="sd">        * `max_total_receiver_queue_size_across_partitions`</span>
+<span class="sd">          Set the max total receiver queue size across partitions.</span>
+<span class="sd">          This setting will be used to reduce the receiver queue size for individual partitions</span>
+<span class="sd">        * `consumer_name`:</span>
+<span class="sd">          Sets the consumer name.</span>
+<span class="sd">        * `unacked_messages_timeout_ms`:</span>
+<span class="sd">          Sets the timeout in milliseconds for unacknowledged messages. The</span>
+<span class="sd">          timeout needs to be greater than 10 seconds. An exception is thrown if</span>
+<span class="sd">          the given value is less than 10 seconds. If a successful</span>
+<span class="sd">          acknowledgement is not sent within the timeout, all the unacknowledged</span>
+<span class="sd">          messages are redelivered.</span>
+<span class="sd">        * `negative_ack_redelivery_delay_ms`:</span>
+<span class="sd">           The delay after which to redeliver the messages that failed to be</span>
+<span class="sd">           processed (with the `consumer.negative_acknowledge()`)</span>
+<span class="sd">        * `broker_consumer_stats_cache_time_ms`:</span>
+<span class="sd">          Sets the time duration for which the broker-side consumer stats will</span>
+<span class="sd">          be cached in the client.</span>
+<span class="sd">        * `is_read_compacted`:</span>
+<span class="sd">          Selects whether to read the compacted version of the topic</span>
+<span class="sd">        * `properties`:</span>
+<span class="sd">          Sets the properties for the consumer. The properties associated with a consumer</span>
+<span class="sd">          can be used for identify a consumer at broker side.</span>
+<span class="sd">        * `pattern_auto_discovery_period`:</span>
+<span class="sd">          Periods of seconds for consumer to auto discover match topics.</span>
+<span class="sd">        * `initial_position`:</span>
+<span class="sd">          Set the initial position of a consumer  when subscribing to the topic.</span>
+<span class="sd">          It could be either: `InitialPosition.Earliest` or `InitialPosition.Latest`.</span>
+<span class="sd">          Default: `Latest`.</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        * replicate_subscription_state_enabled:</span>
+<span class="sd">          Set whether the subscription status should be replicated.</span>
+<span class="sd">          Default: `False`.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="s1">&#39;subscription_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">ConsumerType</span><span class="p">,</span> <span class="n">consumer_type</span><span class="p">,</span> <span class="s1">&#39;consumer_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">&#39;receiver_queue_size&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">,</span>
+                    <span class="s1">&#39;max_total_receiver_queue_size_across_partitions&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">consumer_name</span><span class="p">,</span> <span class="s1">&#39;consumer_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">,</span> <span class="s1">&#39;unacked_messages_timeout_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">,</span> <span class="s1">&#39;broker_consumer_stats_cache_time_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">negative_ack_redelivery_delay_ms</span><span class="p">,</span> <span class="s1">&#39;negative_ack_redelivery_delay_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">pattern_auto_discovery_period</span><span class="p">,</span> <span class="s1">&#39;pattern_auto_discovery_period&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">&#39;is_read_compacted&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">InitialPosition</span><span class="p">,</span> <span class="n">initial_position</span><span class="p">,</span> <span class="s1">&#39;initial_position&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ConsumerConfiguration</span><span class="p">()</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">consumer_type</span><span class="p">(</span><span class="n">consumer_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">message_listener</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">message_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">message_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">(</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">consumer_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">consumer_name</span><span class="p">(</span><span class="n">consumer_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">unacked_messages_timeout_ms</span><span class="p">(</span><span class="n">unacked_messages_timeout_ms</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">(</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">(</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">subscription_initial_position</span><span class="p">(</span><span class="n">initial_position</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">replicate_subscription_state_enabled</span><span class="p">(</span><span class="n">replicate_subscription_state_enabled</span><span class="p">)</span>
+
+        <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+            <span class="c1"># Single topic</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+            <span class="c1"># List of topics</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_topics</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">_retype</span><span class="p">):</span>
+            <span class="c1"># Regex pattern</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_pattern</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span [...]
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument &#39;topic&#39; is expected to be of a type between (str, list, re.pattern)&quot;</span><span class="p">)</span>
+
+        <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">c</span>
+
+    <span class="k">def</span> <span class="nf">create_reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span>
+                      <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                      <span class="n">reader_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                      <span class="n">reader_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">subscription_role_prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                      <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+                      <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a reader on a particular topic</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`: The name of the topic.</span>
+<span class="sd">        * `start_message_id`: The initial reader positioning is done by specifying a message id.</span>
+<span class="sd">           The options are:</span>
+<span class="sd">            * `MessageId.earliest`: Start reading from the earliest message available in the topic</span>
+<span class="sd">            * `MessageId.latest`: Start reading from the end topic, only getting messages published</span>
+<span class="sd">               after the reader was created</span>
+<span class="sd">            * `MessageId`: When passing a particular message id, the reader will position itself on</span>
+<span class="sd">               that specific position. The first message to be read will be the message next to the</span>
+<span class="sd">               specified messageId. Message id can be serialized into a string and deserialized</span>
+<span class="sd">               back into a `MessageId` object:</span>
+
+<span class="sd">                   # Serialize to string</span>
+<span class="sd">                   s = msg.message_id().serialize()</span>
+
+<span class="sd">                   # Deserialize from string</span>
+<span class="sd">                   msg_id = MessageId.deserialize(s)</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be received by this reader.</span>
+<span class="sd">        * `reader_listener`:</span>
+<span class="sd">          Sets a message listener for the reader. When the listener is set,</span>
+<span class="sd">          the application will receive messages through it. Calls to</span>
+<span class="sd">          `reader.read_next()` will not be allowed. The listener function needs</span>
+<span class="sd">          to accept (reader, message), for example:</span>
+
+<span class="sd">                def my_listener(reader, message):</span>
+<span class="sd">                    # process message</span>
+<span class="sd">                    pass</span>
+
+<span class="sd">        * `receiver_queue_size`:</span>
+<span class="sd">          Sets the size of the reader receive queue. The reader receive</span>
+<span class="sd">          queue controls how many messages can be accumulated by the reader</span>
+<span class="sd">          before the application calls `read_next()`. Using a higher value could</span>
+<span class="sd">          potentially increase the reader throughput at the expense of higher</span>
+<span class="sd">          memory utilization.</span>
+<span class="sd">        * `reader_name`:</span>
+<span class="sd">          Sets the reader name.</span>
+<span class="sd">        * `subscription_role_prefix`:</span>
+<span class="sd">          Sets the subscription role prefix.</span>
+<span class="sd">        * `is_read_compacted`:</span>
+<span class="sd">          Selects whether to read the compacted version of the topic</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="s1">&#39;start_message_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">&#39;receiver_queue_size&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">reader_name</span><span class="p">,</span> <span class="s1">&#39;reader_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_role_prefix</span><span class="p">,</span> <span class="s1">&#39;subscription_role_prefix&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">&#39;is_read_compacted&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ReaderConfiguration</span><span class="p">()</span>
+        <span class="k">if</span> <span class="n">reader_listener</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">reader_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">reader_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">reader_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">reader_name</span><span class="p">(</span><span class="n">reader_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">subscription_role_prefix</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">subscription_role_prefix</span><span class="p">(</span><span class="n">subscription_role_prefix</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">c</span> <span class="o">=</span> <span class="n">Reader</span><span class="p">()</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_reader</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_reader</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">c</span>
+
+    <span class="k">def</span> <span class="nf">get_topic_partitions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the list of partitions for a given topic.</span>
+
+<span class="sd">        If the topic is partitioned, this will return a list of partition names. If the topic is not</span>
+<span class="sd">        partitioned, the returned list will contain the topic name itself.</span>
+
+<span class="sd">        This can be used to discover the partitions and create Reader, Consumer or Producer</span>
+<span class="sd">        instances directly on a particular partition.</span>
+<span class="sd">        :param topic: the topic name to lookup</span>
+<span class="sd">        :return: a list of partition name</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">get_topic_partitions</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Perform immediate shutdown of Pulsar client.</span>
+
+<span class="sd">        Release all resources and close all producer, consumer, and readers without waiting</span>
+<span class="sd">        for ongoing operations to complete.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the client and all the associated producers and consumers</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+
+<span class="k">class</span> <span class="nc">Producer</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    The Pulsar message producer, used to publish messages on a topic.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic which producer is publishing to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">producer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the producer name which could have been assigned by the</span>
+<span class="sd">        system or specified by the client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">producer_name</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">last_sequence_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the last sequence id that was published by this producer.</span>
+
+<span class="sd">        This represent either the automatically assigned or custom sequence id</span>
+<span class="sd">        (set on the `MessageBuilder`) that was published and acknowledged by the broker.</span>
+
+<span class="sd">        After recreating a producer with the same producer name, this will return the</span>
+<span class="sd">        last message that was published in the previous producer session, or -1 if</span>
+<span class="sd">        there no message was ever published.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">last_sequence_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span>
+             <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+             <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Publish a message on the topic. Blocks until the message is acknowledged</span>
+
+<span class="sd">        Returns a `MessageId` object that represents where the message is persisted.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `content`:</span>
+<span class="sd">          A `bytes` object with the message payload.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `properties`:</span>
+<span class="sd">          A dict of application-defined string properties.</span>
+<span class="sd">        * `partition_key`:</span>
+<span class="sd">          Sets the partition key for message routing. A hash of this key is used</span>
+<span class="sd">          to determine the message&#39;s topic partition.</span>
+<span class="sd">        * `sequence_id`:</span>
+<span class="sd">          Specify a custom sequence id for the message being published.</span>
+<span class="sd">        * `replication_clusters`:</span>
+<span class="sd">          Override namespace replication clusters. Note that it is the caller&#39;s</span>
+<span class="sd">          responsibility to provide valid cluster names and that all clusters</span>
+<span class="sd">          have been previously configured as topics. Given an empty list,</span>
+<span class="sd">          the message will replicate according to the namespace configuration.</span>
+<span class="sd">        * `disable_replication`:</span>
+<span class="sd">          Do not replicate this message.</span>
+<span class="sd">        * `event_timestamp`:</span>
+<span class="sd">          Timestamp in millis of the timestamp of event creation</span>
+<span class="sd">        * `deliver_at`:</span>
+<span class="sd">          Specify the this message should not be delivered earlier than the</span>
+<span class="sd">          specified timestamp.</span>
+<span class="sd">          The timestamp is milliseconds and based on UTC</span>
+<span class="sd">        * `deliver_after`:</span>
+<span class="sd">          Specify a delay in timedelta for the delivery of the messages.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                              <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                              <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+
+    <span class="k">def</span> <span class="nf">send_async</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span>
+                   <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                   <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Send a message asynchronously.</span>
+
+<span class="sd">        The `callback` will be invoked once the message has been acknowledged</span>
+<span class="sd">        by the broker.</span>
+
+<span class="sd">        Example:</span>
+
+<span class="sd">            #!python</span>
+<span class="sd">            def callback(res, msg_id):</span>
+<span class="sd">                print(&#39;Message published: %s&#39; % res)</span>
+
+<span class="sd">            producer.send_async(msg, callback)</span>
+
+<span class="sd">        When the producer queue is full, by default the message will be rejected</span>
+<span class="sd">        and the callback invoked with an error code.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `content`:</span>
+<span class="sd">          A `bytes` object with the message payload.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `properties`:</span>
+<span class="sd">          A dict of application0-defined string properties.</span>
+<span class="sd">        * `partition_key`:</span>
+<span class="sd">          Sets the partition key for the message routing. A hash of this key is</span>
+<span class="sd">          used to determine the message&#39;s topic partition.</span>
+<span class="sd">        * `sequence_id`:</span>
+<span class="sd">          Specify a custom sequence id for the message being published.</span>
+<span class="sd">        * `replication_clusters`: Override namespace replication clusters. Note</span>
+<span class="sd">          that it is the caller&#39;s responsibility to provide valid cluster names</span>
+<span class="sd">          and that all clusters have been previously configured as topics.</span>
+<span class="sd">          Given an empty list, the message will replicate per the namespace</span>
+<span class="sd">          configuration.</span>
+<span class="sd">        * `disable_replication`:</span>
+<span class="sd">          Do not replicate this message.</span>
+<span class="sd">        * `event_timestamp`:</span>
+<span class="sd">          Timestamp in millis of the timestamp of event creation</span>
+<span class="sd">        * `deliver_at`:</span>
+<span class="sd">          Specify the this message should not be delivered earlier than the</span>
+<span class="sd">          specified timestamp.</span>
+<span class="sd">          The timestamp is milliseconds and based on UTC</span>
+<span class="sd">        * `deliver_after`:</span>
+<span class="sd">          Specify a delay in timedelta for the delivery of the messages.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                              <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                              <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send_async</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+
+    <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Flush all the messages buffered in the client and wait until all messages have been</span>
+<span class="sd">        successfully persisted</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the producer.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">_build_msg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                   <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                   <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">):</span>
+        <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
+
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="s1">&#39;data&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="s1">&#39;partition_key&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span> <span class="s1">&#39;sequence_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">replication_clusters</span><span class="p">,</span> <span class="s1">&#39;replication_clusters&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="s1">&#39;disable_replication&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span> <span class="s1">&#39;event_timestamp&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">deliver_at</span><span class="p">,</span> <span class="s1">&#39;deliver_at&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">timedelta</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">,</span> <span class="s1">&#39;deliver_after&#39;</span><span class="p">)</span>
+
+        <span class="n">mb</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBuilder</span><span class="p">()</span>
+        <span class="n">mb</span><span class="o">.</span><span class="n">content</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">mb</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">partition_key</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">partition_key</span><span class="p">(</span><span class="n">partition_key</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">sequence_id</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">sequence_id</span><span class="p">(</span><span class="n">sequence_id</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">replication_clusters</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">replication_clusters</span><span class="p">(</span><span class="n">replication_clusters</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">disable_replication</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">disable_replication</span><span class="p">(</span><span class="n">disable_replication</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">event_timestamp</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">(</span><span class="n">event_timestamp</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">deliver_at</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">deliver_at</span><span class="p">(</span><span class="n">deliver_at</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">deliver_after</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">deliver_after</span><span class="p">(</span><span class="n">deliver_after</span><span class="p">)</span>
+
+        <span class="k">return</span> <span class="n">mb</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the producer is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+
+
+<span class="k">class</span> <span class="nc">Consumer</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Pulsar consumer.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic this consumer is subscribed to.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">subscription_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the subscription name.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">subscription_name</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Unsubscribe the current consumer from the topic.</span>
+
+<span class="sd">        This method will block until the operation is completed. Once the</span>
+<span class="sd">        consumer is unsubscribed, no more messages will be received and</span>
+<span class="sd">        subsequent new messages will not be retained for this consumer.</span>
+
+<span class="sd">        This consumer object cannot be reused.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Receive a single message.</span>
+
+<span class="sd">        If a message is not immediately available, this method will block until</span>
+<span class="sd">        a new message is available.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `timeout_millis`:</span>
+<span class="sd">          If specified, the receive will raise an exception if a message is not</span>
+<span class="sd">          available within the timeout.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">&#39;timeout_millis&#39;</span><span class="p">)</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+        <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+        <span class="k">return</span> <span class="n">m</span>
+
+    <span class="k">def</span> <span class="nf">acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the reception of a single message.</span>
+
+<span class="sd">        This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd">        After that, the message will not be re-delivered to this consumer.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">acknowledge_cumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the reception of all the messages in the stream up to (and</span>
+<span class="sd">        including) the provided message.</span>
+
+<span class="sd">        This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd">        After that, the messages will not be re-delivered to this consumer.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">negative_acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the failure to process a single message.</span>
+
+<span class="sd">        When a message is &quot;negatively acked&quot; it will be marked for redelivery after</span>
+<span class="sd">        some fixed delay. The delay is configurable when constructing the consumer</span>
+<span class="sd">        with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</span>
+
+<span class="sd">        This call is not blocking.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">pause_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Pause receiving messages via the `message_listener` until</span>
+<span class="sd">        `resume_message_listener()` is called.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">pause_message_listener</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">resume_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Resume receiving the messages via the message listener.</span>
+<span class="sd">        Asynchronously receive all the messages enqueued from the time</span>
+<span class="sd">        `pause_message_listener()` was called.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">resume_message_listener</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">redeliver_unacknowledged_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Redelivers all the unacknowledged messages. In failover mode, the</span>
+<span class="sd">        request is ignored if the consumer is not active for the given topic. In</span>
+<span class="sd">        shared mode, the consumer&#39;s messages to be redelivered are distributed</span>
+<span class="sd">        across all the connected consumers. This is a non-blocking call and</span>
+<span class="sd">        doesn&#39;t throw an exception. In case the connection breaks, the messages</span>
+<span class="sd">        are redelivered after reconnect.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">redeliver_unacknowledged_messages</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Reset the subscription associated with this consumer to a specific message id or publish timestamp.</span>
+<span class="sd">        The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd">        Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd">        seek() on the individual partitions.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The message id for seek, OR an integer event time to seek to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the consumer.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the consumer is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+
+
+
+<span class="k">class</span> <span class="nc">Reader</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Pulsar topic reader.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic this reader is reading from.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">read_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Read a single message.</span>
+
+<span class="sd">        If a message is not immediately available, this method will block until</span>
+<span class="sd">        a new message is available.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `timeout_millis`:</span>
+<span class="sd">          If specified, the receive will raise an exception if a message is not</span>
+<span class="sd">          available within the timeout.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">&#39;timeout_millis&#39;</span><span class="p">)</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+        <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+        <span class="k">return</span> <span class="n">m</span>
+
+    <span class="k">def</span> <span class="nf">has_message_available</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if there is any message available to read from the current position.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">has_message_available</span><span class="p">();</span>
+
+    <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Reset this reader to a specific message id or publish timestamp.</span>
+<span class="sd">        The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd">        Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd">        seek() on the individual partitions.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The message id for seek, OR an integer event time to seek to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the reader.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the reader is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+
+
+<span class="k">class</span> <span class="nc">CryptoKeyReader</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Default crypto key reader implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create crypto key reader.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `public_key_path`: Path to the public key</span>
+<span class="sd">        * `private_key_path`: Path to private key</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="s1">&#39;public_key_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">&#39;private_key_path&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">cryptoKeyReader</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">CryptoKeyReader</span><span class="p">(</span><span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+
+<span class="k">def</span> <span class="nf">_check_type</span><span class="p">(</span><span class="n">var_type</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="n">var_type</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument </span><span class="si">%s</span><span class="s2"> is expected to be of type &#39;</span><span class="si">%s</span><span class="s2">&#39; and not &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span>
+                         <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">var_type</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="n">var</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
+
+
+<span class="k">def</span> <span class="nf">_check_type_or_none</span><span class="p">(</span><span class="n">var_type</span><span class="p">,</span> <span class="n">var</span><span class="p">,</span> <span class="n">name</span><span class="p">):</span>
+    <span class="k">if</span> <span class="n">var</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">var</span><span class="p">,</span> <span class="n">var_type</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument </span><span class="si">%s</span><span class="s2"> is expected to be either None or of type &#39;</span><span class="si">%s</span><span class="s2">&#39;&quot;</span>
+                         <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">var_type</span><span class="o">.</span><span class="vm">__name__</span><span class="p">))</span>
+
+
+<span class="k">def</span> <span class="nf">_listener_wrapper</span><span class="p">(</span><span class="n">listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">):</span>
+    <span class="k">def</span> <span class="nf">wrapper</span><span class="p">(</span><span class="n">consumer</span><span class="p">,</span> <span class="n">msg</span><span class="p">):</span>
+        <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="n">consumer</span>
+        <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="n">listener</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">m</span><span class="p">)</span>
+    <span class="k">return</span> <span class="n">wrapper</span>
+</pre></div>
+
+        </details>
+
+            </section>
+                <section id="MessageId">
+                                <div class="attr class">
+        <a class="headerlink" href="#MessageId">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">MessageId</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">MessageId</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Represents a message id</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partition</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">ledger_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">entry_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">batch_index</spa [...]
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">(</span><span class="n">partition</span><span class="p">,</span> <span class="n">ledger_id</span><span class="p">,</span> <span class="n">entry_id</span><span class="p">,</span> <span class="n">batch_index</span><span class="p">)</span>
+
+    <span class="s1">&#39;Represents the earliest message stored in a topic&#39;</span>
+    <span class="n">earliest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">earliest</span>
+
+    <span class="s1">&#39;Represents the latest message published on a topic&#39;</span>
+    <span class="n">latest</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">latest</span>
+
+    <span class="k">def</span> <span class="nf">ledger_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">ledger_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">entry_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">entry_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">batch_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">batch_index</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">partition</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns a bytes representation of the message id.</span>
+<span class="sd">        This bytes sequence can be stored and later deserialized.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">serialize</span><span class="p">()</span>
+
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Deserialize a message id object from a previously</span>
+<span class="sd">        serialized bytes sequence.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Represents a message id</p>
+</div>
+
+
+                            <div id="MessageId.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageId.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">MessageId</span><span class="signature">(partition=-1, ledger_id=-1, entry_id=-1, batch_index=-1)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">partition</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">ledger_id</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">entry_id</span><span class="o">=-</span><span class="mi">1 [...]
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">(</span><span class="n">partition</span><span class="p">,</span> <span class="n">ledger_id</span><span class="p">,</span> <span class="n">entry_id</span><span class="p">,</span> <span class="n">batch_index</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="MessageId.earliest" class="classattr">
+                                            <div class="attr variable"><a class="headerlink" href="#MessageId.earliest">#&nbsp;&nbsp</a>
+
+        <span class="name">earliest</span><span class="default_value"> = &lt;_pulsar.MessageId object&gt;</span>
+    </div>
+
+    
+            <div class="docstring"><p>Represents the latest message published on a topic</p>
+</div>
+
+
+                            </div>
+                            <div id="MessageId.latest" class="classattr">
+                                            <div class="attr variable"><a class="headerlink" href="#MessageId.latest">#&nbsp;&nbsp</a>
+
+        <span class="name">latest</span><span class="default_value"> = &lt;_pulsar.MessageId object&gt;</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="MessageId.ledger_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageId.ledger_id">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">ledger_id</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">ledger_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">ledger_id</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="MessageId.entry_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageId.entry_id">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">entry_id</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">entry_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">entry_id</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="MessageId.batch_index" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageId.batch_index">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">batch_index</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">batch_index</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">batch_index</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="MessageId.partition" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageId.partition">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">partition</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">partition</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">partition</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="MessageId.serialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageId.serialize">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">serialize</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns a bytes representation of the message id.</span>
+<span class="sd">        This bytes sequence can be stored and later deserialized.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_id</span><span class="o">.</span><span class="n">serialize</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns a bytes representation of the message id.
+This bytes sequence can be stored and later deserialized.</p>
+</div>
+
+
+                            </div>
+                            <div id="MessageId.deserialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageId.deserialize">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@staticmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">deserialize</span><span class="signature">(message_id_bytes)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="nd">@staticmethod</span>
+    <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Deserialize a message id object from a previously</span>
+<span class="sd">        serialized bytes sequence.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="n">message_id_bytes</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Deserialize a message id object from a previously
+serialized bytes sequence.</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="Message">
+                                <div class="attr class">
+        <a class="headerlink" href="#Message">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Message</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Message</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Message objects are returned by a consumer, either by calling `receive` or</span>
+<span class="sd">    through a listener.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns object typed bytes with the payload of the message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns object with the de-serialized version of the message content</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
+
+    <span class="k">def</span> <span class="nf">properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the properties attached to the message. Properties are</span>
+<span class="sd">        application-defined key/value pairs that will be attached to the</span>
+<span class="sd">        message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">properties</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the partitioning key for the message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">partition_key</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">publish_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the timestamp in milliseconds with the message publish time.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">publish_timestamp</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">event_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the timestamp in milliseconds with the message event time.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        The message ID that can be used to refere to this particular message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">message_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the topic Name from which this message originated from</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">topic_name</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">redelivery_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the redelivery count for this message</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">redelivery_count</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">schema_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the schema version for this message</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">schema_version</span><span class="p">()</span>
+
+    <span class="nd">@staticmethod</span>
+    <span class="k">def</span> <span class="nf">_wrap</span><span class="p">(</span><span class="n">_message</span><span class="p">):</span>
+        <span class="bp">self</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">_message</span>
+        <span class="k">return</span> <span class="bp">self</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Message objects are returned by a consumer, either by calling <code>receive</code> or
+through a listener.</p>
+</div>
+
+
+                            <div id="Message.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Message</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="Message.data" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.data">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">data</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">data</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns object typed bytes with the payload of the message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns object typed bytes with the payload of the message.</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.value" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.value">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">value</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">value</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Returns object with the de-serialized version of the message content</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">data</span><span class="p">())</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns object with the de-serialized version of the message content</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.properties" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.properties">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">properties</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the properties attached to the message. Properties are</span>
+<span class="sd">        application-defined key/value pairs that will be attached to the</span>
+<span class="sd">        message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">properties</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the properties attached to the message. Properties are
+application-defined key/value pairs that will be attached to the
+message.</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.partition_key" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.partition_key">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">partition_key</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the partitioning key for the message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">partition_key</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the partitioning key for the message.</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.publish_timestamp" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.publish_timestamp">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">publish_timestamp</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">publish_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the timestamp in milliseconds with the message publish time.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">publish_timestamp</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the timestamp in milliseconds with the message publish time.</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.event_timestamp" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.event_timestamp">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">event_timestamp</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">event_timestamp</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the timestamp in milliseconds with the message event time.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the timestamp in milliseconds with the message event time.</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.message_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.message_id">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">message_id</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        The message ID that can be used to refere to this particular message.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">message_id</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>The message ID that can be used to refere to this particular message.</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.topic_name" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.topic_name">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">topic_name</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the topic Name from which this message originated from</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">topic_name</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the topic Name from which this message originated from</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.redelivery_count" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.redelivery_count">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">redelivery_count</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">redelivery_count</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the redelivery count for this message</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">redelivery_count</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the redelivery count for this message</p>
+</div>
+
+
+                            </div>
+                            <div id="Message.schema_version" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Message.schema_version">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">schema_version</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">schema_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the schema version for this message</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_message</span><span class="o">.</span><span class="n">schema_version</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the schema version for this message</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="MessageBatch">
+                                <div class="attr class">
+        <a class="headerlink" href="#MessageBatch">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">MessageBatch</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">MessageBatch</span><span class="p">:</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBatch</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">with_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg_id</span><span class="p">):</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">):</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">MessageId</span><span class="p">):</span>
+                <span class="n">msg_id</span> <span class="o">=</span> <span class="n">msg_id</span><span class="o">.</span><span class="n">_msg_id</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;unknown message id type&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">with_message_id</span><span class="p">(</span><span class="n">msg_id</span><span class="p">)</span>
+        <span class="k">return</span> <span class="bp">self</span>
+
+    <span class="k">def</span> <span class="nf">parse_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">parse_from</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+        <span class="n">_msgs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">messages</span><span class="p">()</span>
+        <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">Message</span><span class="o">.</span><span class="n">_wrap</span><span class="p">,</span> <span class="n">_msgs</span><span class="p">))</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            <div id="MessageBatch.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageBatch.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">MessageBatch</span><span class="signature">()</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBatch</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="MessageBatch.with_message_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageBatch.with_message_id">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">with_message_id</span><span class="signature">(self, msg_id)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">with_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg_id</span><span class="p">):</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">):</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">msg_id</span><span class="p">,</span> <span class="n">MessageId</span><span class="p">):</span>
+                <span class="n">msg_id</span> <span class="o">=</span> <span class="n">msg_id</span><span class="o">.</span><span class="n">_msg_id</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;unknown message id type&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">with_message_id</span><span class="p">(</span><span class="n">msg_id</span><span class="p">)</span>
+        <span class="k">return</span> <span class="bp">self</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="MessageBatch.parse_from" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#MessageBatch.parse_from">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">parse_from</span><span class="signature">(self, data, size)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">parse_from</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">):</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">parse_from</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">size</span><span class="p">)</span>
+        <span class="n">_msgs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_msg_batch</span><span class="o">.</span><span class="n">messages</span><span class="p">()</span>
+        <span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="n">Message</span><span class="o">.</span><span class="n">_wrap</span><span class="p">,</span> <span class="n">_msgs</span><span class="p">))</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                </section>
+                <section id="Authentication">
+                                <div class="attr class">
+        <a class="headerlink" href="#Authentication">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Authentication</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Authentication</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Authentication provider object. Used to load authentication from an external</span>
+<span class="sd">    shared library.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `dynamicLibPath`: Path to the authentication provider shared library</span>
+<span class="sd">          (such as `tls.so`)</span>
+<span class="sd">        * `authParamsString`: Comma-separated list of provider-specific</span>
+<span class="sd">          configuration params</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="s1">&#39;dynamicLibPath&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">,</span> <span class="s1">&#39;authParamsString&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Authentication</span><span class="p">(</span><span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Authentication provider object. Used to load authentication from an external
+shared library.</p>
+</div>
+
+
+                            <div id="Authentication.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Authentication.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Authentication</span><span class="signature">(dynamicLibPath, authParamsString)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `dynamicLibPath`: Path to the authentication provider shared library</span>
+<span class="sd">          (such as `tls.so`)</span>
+<span class="sd">        * `authParamsString`: Comma-separated list of provider-specific</span>
+<span class="sd">          configuration params</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">dynamicLibPath</span><span class="p">,</span> <span class="s1">&#39;dynamicLibPath&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">,</span> <span class="s1">&#39;authParamsString&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Authentication</span><span class="p">(</span><span class="n">dynamicLibPath</span><span class="p">,</span> <span class="n">authParamsString</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create the authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>dynamicLibPath</code>: Path to the authentication provider shared library
+(such as <code>tls.so</code>)</li>
+<li><code>authParamsString</code>: Comma-separated list of provider-specific
+configuration params</li>
+</ul>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="AuthenticationTLS">
+                                <div class="attr class">
+        <a class="headerlink" href="#AuthenticationTLS">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">AuthenticationTLS</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationTLS</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    TLS Authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the TLS authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `certificatePath`: Path to the public certificate</span>
+<span class="sd">        * `privateKeyPath`: Path to private TLS key</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="s1">&#39;certificate_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">&#39;private_key_path&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationTLS</span><span class="p">(</span><span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>TLS Authentication implementation</p>
+</div>
+
+
+                            <div id="AuthenticationTLS.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#AuthenticationTLS.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">AuthenticationTLS</span><span class="signature">(certificate_path, private_key_path)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the TLS authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `certificatePath`: Path to the public certificate</span>
+<span class="sd">        * `privateKeyPath`: Path to private TLS key</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">certificate_path</span><span class="p">,</span> <span class="s1">&#39;certificate_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">&#39;private_key_path&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationTLS</span><span class="p">(</span><span class="n">certificate_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create the TLS authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>certificatePath</code>: Path to the public certificate</li>
+<li><code>privateKeyPath</code>: Path to private TLS key</li>
+</ul>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="AuthenticationToken">
+                                <div class="attr class">
+        <a class="headerlink" href="#AuthenticationToken">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">AuthenticationToken</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationToken</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Token based authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the token authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `token`: A string containing the token or a functions that provides a</span>
+<span class="sd">                   string with the token</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">callable</span><span class="p">(</span><span class="n">token</span><span class="p">)):</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument token is expected to be of type &#39;str&#39; or a function returning &#39;str&#39;&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationToken</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Token based authentication implementation</p>
+</div>
+
+
+                            <div id="AuthenticationToken.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#AuthenticationToken.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">AuthenticationToken</span><span class="signature">(token)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the token authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `token`: A string containing the token or a functions that provides a</span>
+<span class="sd">                   string with the token</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">or</span> <span class="n">callable</span><span class="p">(</span><span class="n">token</span><span class="p">)):</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument token is expected to be of type &#39;str&#39; or a function returning &#39;str&#39;&quot;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationToken</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create the token authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>token</code>: A string containing the token or a functions that provides a
+       string with the token</li>
+</ul>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="AuthenticationAthenz">
+                                <div class="attr class">
+        <a class="headerlink" href="#AuthenticationAthenz">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">AuthenticationAthenz</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationAthenz</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Athenz Authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the Athenz authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `auth_params_string`: JSON encoded configuration for Athenz client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">&#39;auth_params_string&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationAthenz</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Athenz Authentication implementation</p>
+</div>
+
+
+                            <div id="AuthenticationAthenz.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#AuthenticationAthenz.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">AuthenticationAthenz</span><span class="signature">(auth_params_string)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the Athenz authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `auth_params_string`: JSON encoded configuration for Athenz client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">&#39;auth_params_string&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationAthenz</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create the Athenz authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>auth_params_string</code>: JSON encoded configuration for Athenz client</li>
+</ul>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="AuthenticationOauth2">
+                                <div class="attr class">
+        <a class="headerlink" href="#AuthenticationOauth2">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">AuthenticationOauth2</span><wbr>(<span class="base"><a href="#Authentication">Authentication</a></span>):
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">AuthenticationOauth2</span><span class="p">(</span><span class="n">Authentication</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Oauth2 Authentication implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the Oauth2 authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `auth_params_string`: JSON encoded configuration for Oauth2 client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">&#39;auth_params_string&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationOauth2</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Oauth2 Authentication implementation</p>
+</div>
+
+
+                            <div id="AuthenticationOauth2.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#AuthenticationOauth2.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">AuthenticationOauth2</span><span class="signature">(auth_params_string)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create the Oauth2 authentication provider instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `auth_params_string`: JSON encoded configuration for Oauth2 client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">auth_params_string</span><span class="p">,</span> <span class="s1">&#39;auth_params_string&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">auth</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">AuthenticationOauth2</span><span class="p">(</span><span class="n">auth_params_string</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create the Oauth2 authentication provider instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>auth_params_string</code>: JSON encoded configuration for Oauth2 client</li>
+</ul>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="Client">
+                                <div class="attr class">
+        <a class="headerlink" href="#Client">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Client</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Client</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    The Pulsar client. A single client instance can be used to create producers</span>
+<span class="sd">    and consumers on multiple topics.</span>
+
+<span class="sd">    The client will share the same connection pool and threads across all</span>
+<span class="sd">    producers and consumers.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span>
+                 <span class="n">authentication</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">operation_timeout_seconds</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
+                 <span class="n">io_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">message_listener_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">concurrent_lookup_requests</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                 <span class="n">log_conf_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">use_tls</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">tls_trust_certs_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">tls_allow_insecure_connection</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">tls_validate_hostname</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">connection_timeout_ms</span><span class="o">=</span><span class="mi">10000</span><span class="p">,</span>
+                 <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a new Pulsar client instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `service_url`: The Pulsar service url eg: pulsar://my-broker.com:6650/</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `authentication`:</span>
+<span class="sd">          Set the authentication provider to be used with the broker. For example:</span>
+<span class="sd">          `AuthenticationTls`, AuthenticaionToken, `AuthenticationAthenz`or `AuthenticationOauth2`</span>
+<span class="sd">        * `operation_timeout_seconds`:</span>
+<span class="sd">          Set timeout on client operations (subscribe, create producer, close,</span>
+<span class="sd">          unsubscribe).</span>
+<span class="sd">        * `io_threads`:</span>
+<span class="sd">          Set the number of IO threads to be used by the Pulsar client.</span>
+<span class="sd">        * `message_listener_threads`:</span>
+<span class="sd">          Set the number of threads to be used by the Pulsar client when</span>
+<span class="sd">          delivering messages through message listener. The default is 1 thread</span>
+<span class="sd">          per Pulsar client. If using more than 1 thread, messages for distinct</span>
+<span class="sd">          `message_listener`s will be delivered in different threads, however a</span>
+<span class="sd">          single `MessageListener` will always be assigned to the same thread.</span>
+<span class="sd">        * `concurrent_lookup_requests`:</span>
+<span class="sd">          Number of concurrent lookup-requests allowed on each broker connection</span>
+<span class="sd">          to prevent overload on the broker.</span>
+<span class="sd">        * `log_conf_file_path`:</span>
+<span class="sd">          Initialize log4cxx from a configuration file.</span>
+<span class="sd">        * `use_tls`:</span>
+<span class="sd">          Configure whether to use TLS encryption on the connection. This setting</span>
+<span class="sd">          is deprecated. TLS will be automatically enabled if the `serviceUrl` is</span>
+<span class="sd">          set to `pulsar+ssl://` or `https://`</span>
+<span class="sd">        * `tls_trust_certs_file_path`:</span>
+<span class="sd">          Set the path to the trusted TLS certificate file. If empty defaults to</span>
+<span class="sd">          certifi.</span>
+<span class="sd">        * `tls_allow_insecure_connection`:</span>
+<span class="sd">          Configure whether the Pulsar client accepts untrusted TLS certificates</span>
+<span class="sd">          from the broker.</span>
+<span class="sd">        * `tls_validate_hostname`:</span>
+<span class="sd">          Configure whether the Pulsar client validates that the hostname of the</span>
+<span class="sd">          endpoint, matches the common name on the TLS certificate presented by</span>
+<span class="sd">          the endpoint.</span>
+<span class="sd">        * `logger`:</span>
+<span class="sd">          Set a Python logger for this Pulsar client. Should be an instance of `logging.Logger`.</span>
+<span class="sd">        * `connection_timeout_ms`:</span>
+<span class="sd">          Set timeout in milliseconds on TCP connections.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span> <span class="s1">&#39;service_url&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">Authentication</span><span class="p">,</span> <span class="n">authentication</span><span class="p">,</span> <span class="s1">&#39;authentication&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">operation_timeout_seconds</span><span class="p">,</span> <span class="s1">&#39;operation_timeout_seconds&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">connection_timeout_ms</span><span class="p">,</span> <span class="s1">&#39;connection_timeout_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">io_threads</span><span class="p">,</span> <span class="s1">&#39;io_threads&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">message_listener_threads</span><span class="p">,</span> <span class="s1">&#39;message_listener_threads&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">concurrent_lookup_requests</span><span class="p">,</span> <span class="s1">&#39;concurrent_lookup_requests&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">log_conf_file_path</span><span class="p">,</span> <span class="s1">&#39;log_conf_file_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">use_tls</span><span class="p">,</span> <span class="s1">&#39;use_tls&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">tls_trust_certs_file_path</span><span class="p">,</span> <span class="s1">&#39;tls_trust_certs_file_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_allow_insecure_connection</span><span class="p">,</span> <span class="s1">&#39;tls_allow_insecure_connection&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_validate_hostname</span><span class="p">,</span> <span class="s1">&#39;tls_validate_hostname&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Logger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="s1">&#39;logger&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ClientConfiguration</span><span class="p">()</span>
+        <span class="k">if</span> <span class="n">authentication</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">authentication</span><span class="p">(</span><span class="n">authentication</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">operation_timeout_seconds</span><span class="p">(</span><span class="n">operation_timeout_seconds</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">connection_timeout</span><span class="p">(</span><span class="n">connection_timeout_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">io_threads</span><span class="p">(</span><span class="n">io_threads</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">message_listener_threads</span><span class="p">(</span><span class="n">message_listener_threads</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">concurrent_lookup_requests</span><span class="p">(</span><span class="n">concurrent_lookup_requests</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">log_conf_file_path</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">log_conf_file_path</span><span class="p">(</span><span class="n">log_conf_file_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">logger</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">set_logger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">use_tls</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;pulsar+ssl://&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://&#39;</span><span class="p">):</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">use_tls</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">tls_trust_certs_file_path</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">tls_trust_certs_file_path</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">certifi</span><span class="o">.</span><span class="n">where</span><span class="p">())</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">tls_allow_insecure_connection</span><span class="p">(</span><span class="n">tls_allow_insecure_connection</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">tls_validate_hostname</span><span class="p">(</span><span class="n">tls_validate_hostname</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">service_url</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span> <span class="o">=</span> <span class="p">[]</span>
+
+    <span class="k">def</span> <span class="nf">create_producer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span>
+                        <span class="n">producer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                        <span class="n">initial_sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">send_timeout_millis</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+                        <span class="n">compression_type</span><span class="o">=</span><span class="n">CompressionType</span><span class="o">.</span><span class="n">NONE</span><span class="p">,</span>
+                        <span class="n">max_pending_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                        <span class="n">max_pending_messages_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                        <span class="n">block_if_queue_full</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">batching_enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">batching_max_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                        <span class="n">batching_max_allowed_size_in_bytes</span><span class="o">=</span><span class="mi">128</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span>
+                        <span class="n">batching_max_publish_delay_ms</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
+                        <span class="n">message_routing_mode</span><span class="o">=</span><span class="n">PartitionsRoutingMode</span><span class="o">.</span><span class="n">RoundRobinDistribution</span><span class="p">,</span>
+                        <span class="n">lazy_start_partitioned_producers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">batching_type</span><span class="o">=</span><span class="n">BatchingType</span><span class="o">.</span><span class="n">Default</span><span class="p">,</span>
+                        <span class="n">encryption_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+                        <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a new producer on a given topic.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`:</span>
+<span class="sd">          The topic name</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `producer_name`:</span>
+<span class="sd">           Specify a name for the producer. If not assigned,</span>
+<span class="sd">           the system will generate a globally unique name which can be accessed</span>
+<span class="sd">           with `Producer.producer_name()`. When specifying a name, it is app to</span>
+<span class="sd">           the user to ensure that, for a given topic, the producer name is unique</span>
+<span class="sd">           across all Pulsar&#39;s clusters.</span>
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be published by this producer.</span>
+<span class="sd">           The schema will be used for two purposes:</span>
+<span class="sd">             - Validate the data format against the topic defined schema</span>
+<span class="sd">             - Perform serialization/deserialization between data and objects</span>
+<span class="sd">           An example for this parameter would be to pass `schema=JsonSchema(MyRecordClass)`.</span>
+<span class="sd">        * `initial_sequence_id`:</span>
+<span class="sd">           Set the baseline for the sequence ids for messages</span>
+<span class="sd">           published by the producer. First message will be using</span>
+<span class="sd">           `(initialSequenceId + 1)`` as its sequence id and subsequent messages will</span>
+<span class="sd">           be assigned incremental sequence ids, if not otherwise specified.</span>
+<span class="sd">        * `send_timeout_millis`:</span>
+<span class="sd">          If a message is not acknowledged by the server before the</span>
+<span class="sd">          `send_timeout` expires, an error will be reported.</span>
+<span class="sd">        * `compression_type`:</span>
+<span class="sd">          Set the compression type for the producer. By default, message</span>
+<span class="sd">          payloads are not compressed. Supported compression types are</span>
+<span class="sd">          `CompressionType.LZ4`, `CompressionType.ZLib`, `CompressionType.ZSTD` and `CompressionType.SNAPPY`.</span>
+<span class="sd">          ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that</span>
+<span class="sd">          release in order to be able to receive messages compressed with ZSTD.</span>
+<span class="sd">          SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that</span>
+<span class="sd">          release in order to be able to receive messages compressed with SNAPPY.</span>
+<span class="sd">        * `max_pending_messages`:</span>
+<span class="sd">          Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd">          an acknowledgment from the broker.</span>
+<span class="sd">        * `max_pending_messages_across_partitions`:</span>
+<span class="sd">          Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd">          an acknowledgment across partitions from the broker.</span>
+<span class="sd">        * `block_if_queue_full`: Set whether `send_async` operations should</span>
+<span class="sd">          block when the outgoing message queue is full.</span>
+<span class="sd">        * `message_routing_mode`:</span>
+<span class="sd">          Set the message routing mode for the partitioned producer. Default is `PartitionsRoutingMode.RoundRobinDistribution`,</span>
+<span class="sd">          other option is `PartitionsRoutingMode.UseSinglePartition`</span>
+<span class="sd">        * `lazy_start_partitioned_producers`:</span>
+<span class="sd">          This config affects producers of partitioned topics only. It controls whether</span>
+<span class="sd">          producers register and connect immediately to the owner broker of each partition</span>
+<span class="sd">          or start lazily on demand. The internal producer of one partition is always</span>
+<span class="sd">          started eagerly, chosen by the routing policy, but the internal producers of</span>
+<span class="sd">          any additional partitions are started on demand, upon receiving their first</span>
+<span class="sd">          message.</span>
+<span class="sd">          Using this mode can reduce the strain on brokers for topics with large numbers of</span>
+<span class="sd">          partitions and when the SinglePartition routing policy is used without keyed messages.</span>
+<span class="sd">          Because producer connection can be on demand, this can produce extra send latency</span>
+<span class="sd">          for the first messages of a given partition.</span>
+<span class="sd">        * `properties`:</span>
+<span class="sd">          Sets the properties for the producer. The properties associated with a producer</span>
+<span class="sd">          can be used for identify a producer at broker side.</span>
+<span class="sd">        * `batching_type`:</span>
+<span class="sd">          Sets the batching type for the producer.</span>
+<span class="sd">          There are two batching type: DefaultBatching and KeyBasedBatching.</span>
+<span class="sd">            - Default batching</span>
+<span class="sd">            incoming single messages:</span>
+<span class="sd">            (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd">            batched into single batch message:</span>
+<span class="sd">            [(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</span>
+
+<span class="sd">            - KeyBasedBatching</span>
+<span class="sd">            incoming single messages:</span>
+<span class="sd">            (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd">            batched into single batch message:</span>
+<span class="sd">            [(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</span>
+<span class="sd">        * encryption_key:</span>
+<span class="sd">           The key used for symmetric encryption, configured on the producer side</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">producer_name</span><span class="p">,</span> <span class="s1">&#39;producer_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">initial_sequence_id</span><span class="p">,</span> <span class="s1">&#39;initial_sequence_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">send_timeout_millis</span><span class="p">,</span> <span class="s1">&#39;send_timeout_millis&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">CompressionType</span><span class="p">,</span> <span class="n">compression_type</span><span class="p">,</span> <span class="s1">&#39;compression_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages</span><span class="p">,</span> <span class="s1">&#39;max_pending_messages&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages_across_partitions</span><span class="p">,</span> <span class="s1">&#39;max_pending_messages_across_partitions&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">block_if_queue_full</span><span class="p">,</span> <span class="s1">&#39;block_if_queue_full&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">batching_enabled</span><span class="p">,</span> <span class="s1">&#39;batching_enabled&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_messages</span><span class="p">,</span> <span class="s1">&#39;batching_max_messages&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_allowed_size_in_bytes</span><span class="p">,</span> <span class="s1">&#39;batching_max_allowed_size_in_bytes&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_publish_delay_ms</span><span class="p">,</span> <span class="s1">&#39;batching_max_publish_delay_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">BatchingType</span><span class="p">,</span> <span class="n">batching_type</span><span class="p">,</span> <span class="s1">&#39;batching_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">encryption_key</span><span class="p">,</span> <span class="s1">&#39;encryption_key&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">lazy_start_partitioned_producers</span><span class="p">,</span> <span class="s1">&#39;lazy_start_partitioned_producers&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ProducerConfiguration</span><span class="p">()</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">send_timeout_millis</span><span class="p">(</span><span class="n">send_timeout_millis</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">compression_type</span><span class="p">(</span><span class="n">compression_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages</span><span class="p">(</span><span class="n">max_pending_messages</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages_across_partitions</span><span class="p">(</span><span class="n">max_pending_messages_across_partitions</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">block_if_queue_full</span><span class="p">(</span><span class="n">block_if_queue_full</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_enabled</span><span class="p">(</span><span class="n">batching_enabled</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_messages</span><span class="p">(</span><span class="n">batching_max_messages</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">(</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_publish_delay_ms</span><span class="p">(</span><span class="n">batching_max_publish_delay_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">partitions_routing_mode</span><span class="p">(</span><span class="n">message_routing_mode</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_type</span><span class="p">(</span><span class="n">batching_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">lazy_start_partitioned_producers</span><span class="p">(</span><span class="n">lazy_start_partitioned_producers</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">producer_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">producer_name</span><span class="p">(</span><span class="n">producer_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">initial_sequence_id</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">initial_sequence_id</span><span class="p">(</span><span class="n">initial_sequence_id</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+        <span class="k">if</span> <span class="n">encryption_key</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">encryption_key</span><span class="p">(</span><span class="n">encryption_key</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">p</span> <span class="o">=</span> <span class="n">Producer</span><span class="p">()</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_producer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_producer</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span>
+        <span class="k">return</span> <span class="n">p</span>
+
+    <span class="k">def</span> <span class="nf">subscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span>
+                  <span class="n">consumer_type</span><span class="o">=</span><span class="n">ConsumerType</span><span class="o">.</span><span class="n">Exclusive</span><span class="p">,</span>
+                  <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                  <span class="n">message_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                  <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                  <span class="n">consumer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">unacked_messages_timeout_ms</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">broker_consumer_stats_cache_time_ms</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+                  <span class="n">negative_ack_redelivery_delay_ms</span><span class="o">=</span><span class="mi">60000</span><span class="p">,</span>
+                  <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                  <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">pattern_auto_discovery_period</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+                  <span class="n">initial_position</span><span class="o">=</span><span class="n">InitialPosition</span><span class="o">.</span><span class="n">Latest</span><span class="p">,</span>
+                  <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">replicate_subscription_state_enabled</span><span class="o">=</span><span class="kc">False</span>
+                  <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Subscribe to the given topic and subscription combination.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`: The name of the topic, list of topics or regex pattern.</span>
+<span class="sd">                  This method will accept these forms:</span>
+<span class="sd">                    - `topic=&#39;my-topic&#39;`</span>
+<span class="sd">                    - `topic=[&#39;topic-1&#39;, &#39;topic-2&#39;, &#39;topic-3&#39;]`</span>
+<span class="sd">                    - `topic=re.compile(&#39;persistent://public/default/topic-*&#39;)`</span>
+<span class="sd">        * `subscription`: The name of the subscription.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `consumer_type`:</span>
+<span class="sd">          Select the subscription type to be used when subscribing to the topic.</span>
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be received by this consumer.</span>
+<span class="sd">        * `message_listener`:</span>
+<span class="sd">          Sets a message listener for the consumer. When the listener is set,</span>
+<span class="sd">          the application will receive messages through it. Calls to</span>
+<span class="sd">          `consumer.receive()` will not be allowed. The listener function needs</span>
+<span class="sd">          to accept (consumer, message), for example:</span>
+
+<span class="sd">                #!python</span>
+<span class="sd">                def my_listener(consumer, message):</span>
+<span class="sd">                    # process message</span>
+<span class="sd">                    consumer.acknowledge(message)</span>
+
+<span class="sd">        * `receiver_queue_size`:</span>
+<span class="sd">          Sets the size of the consumer receive queue. The consumer receive</span>
+<span class="sd">          queue controls how many messages can be accumulated by the consumer</span>
+<span class="sd">          before the application calls `receive()`. Using a higher value could</span>
+<span class="sd">          potentially increase the consumer throughput at the expense of higher</span>
+<span class="sd">          memory utilization. Setting the consumer queue size to zero decreases</span>
+<span class="sd">          the throughput of the consumer by disabling pre-fetching of messages.</span>
+<span class="sd">          This approach improves the message distribution on shared subscription</span>
+<span class="sd">          by pushing messages only to those consumers that are ready to process</span>
+<span class="sd">          them. Neither receive with timeout nor partitioned topics can be used</span>
+<span class="sd">          if the consumer queue size is zero. The `receive()` function call</span>
+<span class="sd">          should not be interrupted when the consumer queue size is zero. The</span>
+<span class="sd">          default value is 1000 messages and should work well for most use</span>
+<span class="sd">          cases.</span>
+<span class="sd">        * `max_total_receiver_queue_size_across_partitions`</span>
+<span class="sd">          Set the max total receiver queue size across partitions.</span>
+<span class="sd">          This setting will be used to reduce the receiver queue size for individual partitions</span>
+<span class="sd">        * `consumer_name`:</span>
+<span class="sd">          Sets the consumer name.</span>
+<span class="sd">        * `unacked_messages_timeout_ms`:</span>
+<span class="sd">          Sets the timeout in milliseconds for unacknowledged messages. The</span>
+<span class="sd">          timeout needs to be greater than 10 seconds. An exception is thrown if</span>
+<span class="sd">          the given value is less than 10 seconds. If a successful</span>
+<span class="sd">          acknowledgement is not sent within the timeout, all the unacknowledged</span>
+<span class="sd">          messages are redelivered.</span>
+<span class="sd">        * `negative_ack_redelivery_delay_ms`:</span>
+<span class="sd">           The delay after which to redeliver the messages that failed to be</span>
+<span class="sd">           processed (with the `consumer.negative_acknowledge()`)</span>
+<span class="sd">        * `broker_consumer_stats_cache_time_ms`:</span>
+<span class="sd">          Sets the time duration for which the broker-side consumer stats will</span>
+<span class="sd">          be cached in the client.</span>
+<span class="sd">        * `is_read_compacted`:</span>
+<span class="sd">          Selects whether to read the compacted version of the topic</span>
+<span class="sd">        * `properties`:</span>
+<span class="sd">          Sets the properties for the consumer. The properties associated with a consumer</span>
+<span class="sd">          can be used for identify a consumer at broker side.</span>
+<span class="sd">        * `pattern_auto_discovery_period`:</span>
+<span class="sd">          Periods of seconds for consumer to auto discover match topics.</span>
+<span class="sd">        * `initial_position`:</span>
+<span class="sd">          Set the initial position of a consumer  when subscribing to the topic.</span>
+<span class="sd">          It could be either: `InitialPosition.Earliest` or `InitialPosition.Latest`.</span>
+<span class="sd">          Default: `Latest`.</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        * replicate_subscription_state_enabled:</span>
+<span class="sd">          Set whether the subscription status should be replicated.</span>
+<span class="sd">          Default: `False`.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="s1">&#39;subscription_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">ConsumerType</span><span class="p">,</span> <span class="n">consumer_type</span><span class="p">,</span> <span class="s1">&#39;consumer_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">&#39;receiver_queue_size&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">,</span>
+                    <span class="s1">&#39;max_total_receiver_queue_size_across_partitions&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">consumer_name</span><span class="p">,</span> <span class="s1">&#39;consumer_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">,</span> <span class="s1">&#39;unacked_messages_timeout_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">,</span> <span class="s1">&#39;broker_consumer_stats_cache_time_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">negative_ack_redelivery_delay_ms</span><span class="p">,</span> <span class="s1">&#39;negative_ack_redelivery_delay_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">pattern_auto_discovery_period</span><span class="p">,</span> <span class="s1">&#39;pattern_auto_discovery_period&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">&#39;is_read_compacted&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">InitialPosition</span><span class="p">,</span> <span class="n">initial_position</span><span class="p">,</span> <span class="s1">&#39;initial_position&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ConsumerConfiguration</span><span class="p">()</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">consumer_type</span><span class="p">(</span><span class="n">consumer_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">message_listener</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">message_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">message_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">(</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">consumer_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">consumer_name</span><span class="p">(</span><span class="n">consumer_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">unacked_messages_timeout_ms</span><span class="p">(</span><span class="n">unacked_messages_timeout_ms</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">(</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">(</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">subscription_initial_position</span><span class="p">(</span><span class="n">initial_position</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">replicate_subscription_state_enabled</span><span class="p">(</span><span class="n">replicate_subscription_state_enabled</span><span class="p">)</span>
+
+        <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+            <span class="c1"># Single topic</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+            <span class="c1"># List of topics</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_topics</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">_retype</span><span class="p">):</span>
+            <span class="c1"># Regex pattern</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_pattern</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span [...]
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument &#39;topic&#39; is expected to be of a type between (str, list, re.pattern)&quot;</span><span class="p">)</span>
+
+        <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">c</span>
+
+    <span class="k">def</span> <span class="nf">create_reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span>
+                      <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                      <span class="n">reader_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                      <span class="n">reader_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">subscription_role_prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                      <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+                      <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a reader on a particular topic</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`: The name of the topic.</span>
+<span class="sd">        * `start_message_id`: The initial reader positioning is done by specifying a message id.</span>
+<span class="sd">           The options are:</span>
+<span class="sd">            * `MessageId.earliest`: Start reading from the earliest message available in the topic</span>
+<span class="sd">            * `MessageId.latest`: Start reading from the end topic, only getting messages published</span>
+<span class="sd">               after the reader was created</span>
+<span class="sd">            * `MessageId`: When passing a particular message id, the reader will position itself on</span>
+<span class="sd">               that specific position. The first message to be read will be the message next to the</span>
+<span class="sd">               specified messageId. Message id can be serialized into a string and deserialized</span>
+<span class="sd">               back into a `MessageId` object:</span>
+
+<span class="sd">                   # Serialize to string</span>
+<span class="sd">                   s = msg.message_id().serialize()</span>
+
+<span class="sd">                   # Deserialize from string</span>
+<span class="sd">                   msg_id = MessageId.deserialize(s)</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be received by this reader.</span>
+<span class="sd">        * `reader_listener`:</span>
+<span class="sd">          Sets a message listener for the reader. When the listener is set,</span>
+<span class="sd">          the application will receive messages through it. Calls to</span>
+<span class="sd">          `reader.read_next()` will not be allowed. The listener function needs</span>
+<span class="sd">          to accept (reader, message), for example:</span>
+
+<span class="sd">                def my_listener(reader, message):</span>
+<span class="sd">                    # process message</span>
+<span class="sd">                    pass</span>
+
+<span class="sd">        * `receiver_queue_size`:</span>
+<span class="sd">          Sets the size of the reader receive queue. The reader receive</span>
+<span class="sd">          queue controls how many messages can be accumulated by the reader</span>
+<span class="sd">          before the application calls `read_next()`. Using a higher value could</span>
+<span class="sd">          potentially increase the reader throughput at the expense of higher</span>
+<span class="sd">          memory utilization.</span>
+<span class="sd">        * `reader_name`:</span>
+<span class="sd">          Sets the reader name.</span>
+<span class="sd">        * `subscription_role_prefix`:</span>
+<span class="sd">          Sets the subscription role prefix.</span>
+<span class="sd">        * `is_read_compacted`:</span>
+<span class="sd">          Selects whether to read the compacted version of the topic</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="s1">&#39;start_message_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">&#39;receiver_queue_size&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">reader_name</span><span class="p">,</span> <span class="s1">&#39;reader_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_role_prefix</span><span class="p">,</span> <span class="s1">&#39;subscription_role_prefix&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">&#39;is_read_compacted&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ReaderConfiguration</span><span class="p">()</span>
+        <span class="k">if</span> <span class="n">reader_listener</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">reader_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">reader_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">reader_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">reader_name</span><span class="p">(</span><span class="n">reader_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">subscription_role_prefix</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">subscription_role_prefix</span><span class="p">(</span><span class="n">subscription_role_prefix</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">c</span> <span class="o">=</span> <span class="n">Reader</span><span class="p">()</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_reader</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_reader</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">c</span>
+
+    <span class="k">def</span> <span class="nf">get_topic_partitions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the list of partitions for a given topic.</span>
+
+<span class="sd">        If the topic is partitioned, this will return a list of partition names. If the topic is not</span>
+<span class="sd">        partitioned, the returned list will contain the topic name itself.</span>
+
+<span class="sd">        This can be used to discover the partitions and create Reader, Consumer or Producer</span>
+<span class="sd">        instances directly on a particular partition.</span>
+<span class="sd">        :param topic: the topic name to lookup</span>
+<span class="sd">        :return: a list of partition name</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">get_topic_partitions</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Perform immediate shutdown of Pulsar client.</span>
+
+<span class="sd">        Release all resources and close all producer, consumer, and readers without waiting</span>
+<span class="sd">        for ongoing operations to complete.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the client and all the associated producers and consumers</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>The Pulsar client. A single client instance can be used to create producers
+and consumers on multiple topics.</p>
+
+<p>The client will share the same connection pool and threads across all
+producers and consumers.</p>
+</div>
+
+
+                            <div id="Client.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Client.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Client</span><span class="signature">(
+    service_url,
+    authentication=None,
+    operation_timeout_seconds=30,
+    io_threads=1,
+    message_listener_threads=1,
+    concurrent_lookup_requests=50000,
+    log_conf_file_path=None,
+    use_tls=False,
+    tls_trust_certs_file_path=None,
+    tls_allow_insecure_connection=False,
+    tls_validate_hostname=False,
+    logger=None,
+    connection_timeout_ms=10000
+)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span>
+                 <span class="n">authentication</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">operation_timeout_seconds</span><span class="o">=</span><span class="mi">30</span><span class="p">,</span>
+                 <span class="n">io_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">message_listener_threads</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span>
+                 <span class="n">concurrent_lookup_requests</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                 <span class="n">log_conf_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">use_tls</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">tls_trust_certs_file_path</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">tls_allow_insecure_connection</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">tls_validate_hostname</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                 <span class="n">logger</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                 <span class="n">connection_timeout_ms</span><span class="o">=</span><span class="mi">10000</span><span class="p">,</span>
+                 <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a new Pulsar client instance.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `service_url`: The Pulsar service url eg: pulsar://my-broker.com:6650/</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `authentication`:</span>
+<span class="sd">          Set the authentication provider to be used with the broker. For example:</span>
+<span class="sd">          `AuthenticationTls`, AuthenticaionToken, `AuthenticationAthenz`or `AuthenticationOauth2`</span>
+<span class="sd">        * `operation_timeout_seconds`:</span>
+<span class="sd">          Set timeout on client operations (subscribe, create producer, close,</span>
+<span class="sd">          unsubscribe).</span>
+<span class="sd">        * `io_threads`:</span>
+<span class="sd">          Set the number of IO threads to be used by the Pulsar client.</span>
+<span class="sd">        * `message_listener_threads`:</span>
+<span class="sd">          Set the number of threads to be used by the Pulsar client when</span>
+<span class="sd">          delivering messages through message listener. The default is 1 thread</span>
+<span class="sd">          per Pulsar client. If using more than 1 thread, messages for distinct</span>
+<span class="sd">          `message_listener`s will be delivered in different threads, however a</span>
+<span class="sd">          single `MessageListener` will always be assigned to the same thread.</span>
+<span class="sd">        * `concurrent_lookup_requests`:</span>
+<span class="sd">          Number of concurrent lookup-requests allowed on each broker connection</span>
+<span class="sd">          to prevent overload on the broker.</span>
+<span class="sd">        * `log_conf_file_path`:</span>
+<span class="sd">          Initialize log4cxx from a configuration file.</span>
+<span class="sd">        * `use_tls`:</span>
+<span class="sd">          Configure whether to use TLS encryption on the connection. This setting</span>
+<span class="sd">          is deprecated. TLS will be automatically enabled if the `serviceUrl` is</span>
+<span class="sd">          set to `pulsar+ssl://` or `https://`</span>
+<span class="sd">        * `tls_trust_certs_file_path`:</span>
+<span class="sd">          Set the path to the trusted TLS certificate file. If empty defaults to</span>
+<span class="sd">          certifi.</span>
+<span class="sd">        * `tls_allow_insecure_connection`:</span>
+<span class="sd">          Configure whether the Pulsar client accepts untrusted TLS certificates</span>
+<span class="sd">          from the broker.</span>
+<span class="sd">        * `tls_validate_hostname`:</span>
+<span class="sd">          Configure whether the Pulsar client validates that the hostname of the</span>
+<span class="sd">          endpoint, matches the common name on the TLS certificate presented by</span>
+<span class="sd">          the endpoint.</span>
+<span class="sd">        * `logger`:</span>
+<span class="sd">          Set a Python logger for this Pulsar client. Should be an instance of `logging.Logger`.</span>
+<span class="sd">        * `connection_timeout_ms`:</span>
+<span class="sd">          Set timeout in milliseconds on TCP connections.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">service_url</span><span class="p">,</span> <span class="s1">&#39;service_url&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">Authentication</span><span class="p">,</span> <span class="n">authentication</span><span class="p">,</span> <span class="s1">&#39;authentication&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">operation_timeout_seconds</span><span class="p">,</span> <span class="s1">&#39;operation_timeout_seconds&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">connection_timeout_ms</span><span class="p">,</span> <span class="s1">&#39;connection_timeout_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">io_threads</span><span class="p">,</span> <span class="s1">&#39;io_threads&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">message_listener_threads</span><span class="p">,</span> <span class="s1">&#39;message_listener_threads&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">concurrent_lookup_requests</span><span class="p">,</span> <span class="s1">&#39;concurrent_lookup_requests&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">log_conf_file_path</span><span class="p">,</span> <span class="s1">&#39;log_conf_file_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">use_tls</span><span class="p">,</span> <span class="s1">&#39;use_tls&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">tls_trust_certs_file_path</span><span class="p">,</span> <span class="s1">&#39;tls_trust_certs_file_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_allow_insecure_connection</span><span class="p">,</span> <span class="s1">&#39;tls_allow_insecure_connection&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">tls_validate_hostname</span><span class="p">,</span> <span class="s1">&#39;tls_validate_hostname&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">logging</span><span class="o">.</span><span class="n">Logger</span><span class="p">,</span> <span class="n">logger</span><span class="p">,</span> <span class="s1">&#39;logger&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ClientConfiguration</span><span class="p">()</span>
+        <span class="k">if</span> <span class="n">authentication</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">authentication</span><span class="p">(</span><span class="n">authentication</span><span class="o">.</span><span class="n">auth</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">operation_timeout_seconds</span><span class="p">(</span><span class="n">operation_timeout_seconds</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">connection_timeout</span><span class="p">(</span><span class="n">connection_timeout_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">io_threads</span><span class="p">(</span><span class="n">io_threads</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">message_listener_threads</span><span class="p">(</span><span class="n">message_listener_threads</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">concurrent_lookup_requests</span><span class="p">(</span><span class="n">concurrent_lookup_requests</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">log_conf_file_path</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">log_conf_file_path</span><span class="p">(</span><span class="n">log_conf_file_path</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">logger</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">set_logger</span><span class="p">(</span><span class="n">logger</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">use_tls</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;pulsar+ssl://&#39;</span><span class="p">)</span> <span class="ow">or</span> <span class="n">service_url</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;https://&#39;</span><span class="p">):</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">use_tls</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">tls_trust_certs_file_path</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">tls_trust_certs_file_path</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">tls_trust_certs_file_path</span><span class="p">(</span><span class="n">certifi</span><span class="o">.</span><span class="n">where</span><span class="p">())</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">tls_allow_insecure_connection</span><span class="p">(</span><span class="n">tls_allow_insecure_connection</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">tls_validate_hostname</span><span class="p">(</span><span class="n">tls_validate_hostname</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">service_url</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span> <span class="o">=</span> <span class="p">[]</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create a new Pulsar client instance.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>service_url</code>: The Pulsar service url eg: pulsar://my-broker.com:6650/</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>authentication</code>:
+Set the authentication provider to be used with the broker. For example:
+<code>AuthenticationTls</code>, AuthenticaionToken, <code><a href="#AuthenticationAthenz">AuthenticationAthenz</a></code>or <code><a href="#AuthenticationOauth2">AuthenticationOauth2</a></code></li>
+<li><code>operation_timeout_seconds</code>:
+Set timeout on client operations (subscribe, create producer, close,
+unsubscribe).</li>
+<li><code>io_threads</code>:
+Set the number of IO threads to be used by the Pulsar client.</li>
+<li><code>message_listener_threads</code>:
+Set the number of threads to be used by the Pulsar client when
+delivering messages through message listener. The default is 1 thread
+per Pulsar client. If using more than 1 thread, messages for distinct
+<code>message_listener</code>s will be delivered in different threads, however a
+single <code>MessageListener</code> will always be assigned to the same thread.</li>
+<li><code>concurrent_lookup_requests</code>:
+Number of concurrent lookup-requests allowed on each broker connection
+to prevent overload on the broker.</li>
+<li><code>log_conf_file_path</code>:
+Initialize log4cxx from a configuration file.</li>
+<li><code>use_tls</code>:
+Configure whether to use TLS encryption on the connection. This setting
+is deprecated. TLS will be automatically enabled if the <code>serviceUrl</code> is
+set to <code>pulsar+ssl://</code> or <code>https://</code></li>
+<li><code>tls_trust_certs_file_path</code>:
+Set the path to the trusted TLS certificate file. If empty defaults to
+certifi.</li>
+<li><code>tls_allow_insecure_connection</code>:
+Configure whether the Pulsar client accepts untrusted TLS certificates
+from the broker.</li>
+<li><code>tls_validate_hostname</code>:
+Configure whether the Pulsar client validates that the hostname of the
+endpoint, matches the common name on the TLS certificate presented by
+the endpoint.</li>
+<li><code>logger</code>:
+Set a Python logger for this Pulsar client. Should be an instance of <code>logging.Logger</code>.</li>
+<li><code>connection_timeout_ms</code>:
+Set timeout in milliseconds on TCP connections.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Client.create_producer" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Client.create_producer">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">create_producer</span><span class="signature">(
+    self,
+    topic,
+    producer_name=None,
+    schema=&lt;<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object&gt;,
+    initial_sequence_id=None,
+    send_timeout_millis=30000,
+    compression_type=_pulsar.CompressionType.NONE,
+    max_pending_messages=1000,
+    max_pending_messages_across_partitions=50000,
+    block_if_queue_full=False,
+    batching_enabled=False,
+    batching_max_messages=1000,
+    batching_max_allowed_size_in_bytes=131072,
+    batching_max_publish_delay_ms=10,
+    message_routing_mode=_pulsar.PartitionsRoutingMode.RoundRobinDistribution,
+    lazy_start_partitioned_producers=False,
+    properties=None,
+    batching_type=_pulsar.BatchingType.Default,
+    encryption_key=None,
+    crypto_key_reader=None
+)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">create_producer</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span>
+                        <span class="n">producer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                        <span class="n">initial_sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">send_timeout_millis</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+                        <span class="n">compression_type</span><span class="o">=</span><span class="n">CompressionType</span><span class="o">.</span><span class="n">NONE</span><span class="p">,</span>
+                        <span class="n">max_pending_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                        <span class="n">max_pending_messages_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                        <span class="n">block_if_queue_full</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">batching_enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">batching_max_messages</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                        <span class="n">batching_max_allowed_size_in_bytes</span><span class="o">=</span><span class="mi">128</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span>
+                        <span class="n">batching_max_publish_delay_ms</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
+                        <span class="n">message_routing_mode</span><span class="o">=</span><span class="n">PartitionsRoutingMode</span><span class="o">.</span><span class="n">RoundRobinDistribution</span><span class="p">,</span>
+                        <span class="n">lazy_start_partitioned_producers</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                        <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">batching_type</span><span class="o">=</span><span class="n">BatchingType</span><span class="o">.</span><span class="n">Default</span><span class="p">,</span>
+                        <span class="n">encryption_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                        <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+                        <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a new producer on a given topic.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`:</span>
+<span class="sd">          The topic name</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `producer_name`:</span>
+<span class="sd">           Specify a name for the producer. If not assigned,</span>
+<span class="sd">           the system will generate a globally unique name which can be accessed</span>
+<span class="sd">           with `Producer.producer_name()`. When specifying a name, it is app to</span>
+<span class="sd">           the user to ensure that, for a given topic, the producer name is unique</span>
+<span class="sd">           across all Pulsar&#39;s clusters.</span>
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be published by this producer.</span>
+<span class="sd">           The schema will be used for two purposes:</span>
+<span class="sd">             - Validate the data format against the topic defined schema</span>
+<span class="sd">             - Perform serialization/deserialization between data and objects</span>
+<span class="sd">           An example for this parameter would be to pass `schema=JsonSchema(MyRecordClass)`.</span>
+<span class="sd">        * `initial_sequence_id`:</span>
+<span class="sd">           Set the baseline for the sequence ids for messages</span>
+<span class="sd">           published by the producer. First message will be using</span>
+<span class="sd">           `(initialSequenceId + 1)`` as its sequence id and subsequent messages will</span>
+<span class="sd">           be assigned incremental sequence ids, if not otherwise specified.</span>
+<span class="sd">        * `send_timeout_millis`:</span>
+<span class="sd">          If a message is not acknowledged by the server before the</span>
+<span class="sd">          `send_timeout` expires, an error will be reported.</span>
+<span class="sd">        * `compression_type`:</span>
+<span class="sd">          Set the compression type for the producer. By default, message</span>
+<span class="sd">          payloads are not compressed. Supported compression types are</span>
+<span class="sd">          `CompressionType.LZ4`, `CompressionType.ZLib`, `CompressionType.ZSTD` and `CompressionType.SNAPPY`.</span>
+<span class="sd">          ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that</span>
+<span class="sd">          release in order to be able to receive messages compressed with ZSTD.</span>
+<span class="sd">          SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that</span>
+<span class="sd">          release in order to be able to receive messages compressed with SNAPPY.</span>
+<span class="sd">        * `max_pending_messages`:</span>
+<span class="sd">          Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd">          an acknowledgment from the broker.</span>
+<span class="sd">        * `max_pending_messages_across_partitions`:</span>
+<span class="sd">          Set the max size of the queue holding the messages pending to receive</span>
+<span class="sd">          an acknowledgment across partitions from the broker.</span>
+<span class="sd">        * `block_if_queue_full`: Set whether `send_async` operations should</span>
+<span class="sd">          block when the outgoing message queue is full.</span>
+<span class="sd">        * `message_routing_mode`:</span>
+<span class="sd">          Set the message routing mode for the partitioned producer. Default is `PartitionsRoutingMode.RoundRobinDistribution`,</span>
+<span class="sd">          other option is `PartitionsRoutingMode.UseSinglePartition`</span>
+<span class="sd">        * `lazy_start_partitioned_producers`:</span>
+<span class="sd">          This config affects producers of partitioned topics only. It controls whether</span>
+<span class="sd">          producers register and connect immediately to the owner broker of each partition</span>
+<span class="sd">          or start lazily on demand. The internal producer of one partition is always</span>
+<span class="sd">          started eagerly, chosen by the routing policy, but the internal producers of</span>
+<span class="sd">          any additional partitions are started on demand, upon receiving their first</span>
+<span class="sd">          message.</span>
+<span class="sd">          Using this mode can reduce the strain on brokers for topics with large numbers of</span>
+<span class="sd">          partitions and when the SinglePartition routing policy is used without keyed messages.</span>
+<span class="sd">          Because producer connection can be on demand, this can produce extra send latency</span>
+<span class="sd">          for the first messages of a given partition.</span>
+<span class="sd">        * `properties`:</span>
+<span class="sd">          Sets the properties for the producer. The properties associated with a producer</span>
+<span class="sd">          can be used for identify a producer at broker side.</span>
+<span class="sd">        * `batching_type`:</span>
+<span class="sd">          Sets the batching type for the producer.</span>
+<span class="sd">          There are two batching type: DefaultBatching and KeyBasedBatching.</span>
+<span class="sd">            - Default batching</span>
+<span class="sd">            incoming single messages:</span>
+<span class="sd">            (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd">            batched into single batch message:</span>
+<span class="sd">            [(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</span>
+
+<span class="sd">            - KeyBasedBatching</span>
+<span class="sd">            incoming single messages:</span>
+<span class="sd">            (k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)</span>
+<span class="sd">            batched into single batch message:</span>
+<span class="sd">            [(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</span>
+<span class="sd">        * encryption_key:</span>
+<span class="sd">           The key used for symmetric encryption, configured on the producer side</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">producer_name</span><span class="p">,</span> <span class="s1">&#39;producer_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">initial_sequence_id</span><span class="p">,</span> <span class="s1">&#39;initial_sequence_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">send_timeout_millis</span><span class="p">,</span> <span class="s1">&#39;send_timeout_millis&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">CompressionType</span><span class="p">,</span> <span class="n">compression_type</span><span class="p">,</span> <span class="s1">&#39;compression_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages</span><span class="p">,</span> <span class="s1">&#39;max_pending_messages&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_pending_messages_across_partitions</span><span class="p">,</span> <span class="s1">&#39;max_pending_messages_across_partitions&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">block_if_queue_full</span><span class="p">,</span> <span class="s1">&#39;block_if_queue_full&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">batching_enabled</span><span class="p">,</span> <span class="s1">&#39;batching_enabled&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_messages</span><span class="p">,</span> <span class="s1">&#39;batching_max_messages&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_allowed_size_in_bytes</span><span class="p">,</span> <span class="s1">&#39;batching_max_allowed_size_in_bytes&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">batching_max_publish_delay_ms</span><span class="p">,</span> <span class="s1">&#39;batching_max_publish_delay_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">BatchingType</span><span class="p">,</span> <span class="n">batching_type</span><span class="p">,</span> <span class="s1">&#39;batching_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">encryption_key</span><span class="p">,</span> <span class="s1">&#39;encryption_key&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">lazy_start_partitioned_producers</span><span class="p">,</span> <span class="s1">&#39;lazy_start_partitioned_producers&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ProducerConfiguration</span><span class="p">()</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">send_timeout_millis</span><span class="p">(</span><span class="n">send_timeout_millis</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">compression_type</span><span class="p">(</span><span class="n">compression_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages</span><span class="p">(</span><span class="n">max_pending_messages</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_pending_messages_across_partitions</span><span class="p">(</span><span class="n">max_pending_messages_across_partitions</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">block_if_queue_full</span><span class="p">(</span><span class="n">block_if_queue_full</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_enabled</span><span class="p">(</span><span class="n">batching_enabled</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_messages</span><span class="p">(</span><span class="n">batching_max_messages</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">(</span><span class="n">batching_max_allowed_size_in_bytes</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_max_publish_delay_ms</span><span class="p">(</span><span class="n">batching_max_publish_delay_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">partitions_routing_mode</span><span class="p">(</span><span class="n">message_routing_mode</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">batching_type</span><span class="p">(</span><span class="n">batching_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">lazy_start_partitioned_producers</span><span class="p">(</span><span class="n">lazy_start_partitioned_producers</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">producer_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">producer_name</span><span class="p">(</span><span class="n">producer_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">initial_sequence_id</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">initial_sequence_id</span><span class="p">(</span><span class="n">initial_sequence_id</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+        <span class="k">if</span> <span class="n">encryption_key</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">encryption_key</span><span class="p">(</span><span class="n">encryption_key</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">p</span> <span class="o">=</span> <span class="n">Producer</span><span class="p">()</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_producer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_producer</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="n">p</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span>
+        <span class="k">return</span> <span class="n">p</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create a new producer on a given topic.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>topic</code>:
+The topic name</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>producer_name</code>:
+Specify a name for the producer. If not assigned,
+the system will generate a globally unique name which can be accessed
+with <code><a href="#Producer.producer_name">Producer.producer_name()</a></code>. When specifying a name, it is app to
+the user to ensure that, for a given topic, the producer name is unique
+across all Pulsar's clusters.</li>
+<li><code>schema</code>:
+Define the schema of the data that will be published by this producer.
+The schema will be used for two purposes:
+<ul>
+<li>Validate the data format against the topic defined schema</li>
+<li>Perform serialization/deserialization between data and objects
+An example for this parameter would be to pass <code>schema=JsonSchema(MyRecordClass)</code>.</li>
+</ul></li>
+<li><code>initial_sequence_id</code>:
+Set the baseline for the sequence ids for messages
+published by the producer. First message will be using
+`(initialSequenceId + 1)`` as its sequence id and subsequent messages will
+be assigned incremental sequence ids, if not otherwise specified.</li>
+<li><code>send_timeout_millis</code>:
+If a message is not acknowledged by the server before the
+<code>send_timeout</code> expires, an error will be reported.</li>
+<li><code>compression_type</code>:
+Set the compression type for the producer. By default, message
+payloads are not compressed. Supported compression types are
+<code>CompressionType.LZ4</code>, <code>CompressionType.ZLib</code>, <code>CompressionType.ZSTD</code> and <code>CompressionType.SNAPPY</code>.
+ZSTD is supported since Pulsar 2.3. Consumers will need to be at least at that
+release in order to be able to receive messages compressed with ZSTD.
+SNAPPY is supported since Pulsar 2.4. Consumers will need to be at least at that
+release in order to be able to receive messages compressed with SNAPPY.</li>
+<li><code>max_pending_messages</code>:
+Set the max size of the queue holding the messages pending to receive
+an acknowledgment from the broker.</li>
+<li><code>max_pending_messages_across_partitions</code>:
+Set the max size of the queue holding the messages pending to receive
+an acknowledgment across partitions from the broker.</li>
+<li><code>block_if_queue_full</code>: Set whether <code>send_async</code> operations should
+block when the outgoing message queue is full.</li>
+<li><code>message_routing_mode</code>:
+Set the message routing mode for the partitioned producer. Default is <code>PartitionsRoutingMode.RoundRobinDistribution</code>,
+other option is <code>PartitionsRoutingMode.UseSinglePartition</code></li>
+<li><code>lazy_start_partitioned_producers</code>:
+This config affects producers of partitioned topics only. It controls whether
+producers register and connect immediately to the owner broker of each partition
+or start lazily on demand. The internal producer of one partition is always
+started eagerly, chosen by the routing policy, but the internal producers of
+any additional partitions are started on demand, upon receiving their first
+message.
+Using this mode can reduce the strain on brokers for topics with large numbers of
+partitions and when the SinglePartition routing policy is used without keyed messages.
+Because producer connection can be on demand, this can produce extra send latency
+for the first messages of a given partition.</li>
+<li><code>properties</code>:
+Sets the properties for the producer. The properties associated with a producer
+can be used for identify a producer at broker side.</li>
+<li><p><code>batching_type</code>:
+Sets the batching type for the producer.
+There are two batching type: DefaultBatching and KeyBasedBatching.</p>
+
+<ul>
+<li><p>Default batching
+incoming single messages:
+(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)
+batched into single batch message:
+[(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)]</p></li>
+<li><p>KeyBasedBatching
+incoming single messages:
+(k1, v1), (k2, v1), (k3, v1), (k1, v2), (k2, v2), (k3, v2), (k1, v3), (k2, v3), (k3, v3)
+batched into single batch message:
+[(k1, v1), (k1, v2), (k1, v3)], [(k2, v1), (k2, v2), (k2, v3)], [(k3, v1), (k3, v2), (k3, v3)]</p></li>
+</ul></li>
+<li>encryption_key:
+The key used for symmetric encryption, configured on the producer side</li>
+<li>crypto_key_reader:
+Symmetric encryption class implementation, configuring public key encryption messages for the producer
+and private key decryption messages for the consumer</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Client.subscribe" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Client.subscribe">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">subscribe</span><span class="signature">(
+    self,
+    topic,
+    subscription_name,
+    consumer_type=_pulsar.ConsumerType.Exclusive,
+    schema=&lt;<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object&gt;,
+    message_listener=None,
+    receiver_queue_size=1000,
+    max_total_receiver_queue_size_across_partitions=50000,
+    consumer_name=None,
+    unacked_messages_timeout_ms=None,
+    broker_consumer_stats_cache_time_ms=30000,
+    negative_ack_redelivery_delay_ms=60000,
+    is_read_compacted=False,
+    properties=None,
+    pattern_auto_discovery_period=60,
+    initial_position=_pulsar.InitialPosition.Latest,
+    crypto_key_reader=None,
+    replicate_subscription_state_enabled=False
+)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">subscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span>
+                  <span class="n">consumer_type</span><span class="o">=</span><span class="n">ConsumerType</span><span class="o">.</span><span class="n">Exclusive</span><span class="p">,</span>
+                  <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                  <span class="n">message_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                  <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="o">=</span><span class="mi">50000</span><span class="p">,</span>
+                  <span class="n">consumer_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">unacked_messages_timeout_ms</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">broker_consumer_stats_cache_time_ms</span><span class="o">=</span><span class="mi">30000</span><span class="p">,</span>
+                  <span class="n">negative_ack_redelivery_delay_ms</span><span class="o">=</span><span class="mi">60000</span><span class="p">,</span>
+                  <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                  <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">pattern_auto_discovery_period</span><span class="o">=</span><span class="mi">60</span><span class="p">,</span>
+                  <span class="n">initial_position</span><span class="o">=</span><span class="n">InitialPosition</span><span class="o">.</span><span class="n">Latest</span><span class="p">,</span>
+                  <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                  <span class="n">replicate_subscription_state_enabled</span><span class="o">=</span><span class="kc">False</span>
+                  <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Subscribe to the given topic and subscription combination.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`: The name of the topic, list of topics or regex pattern.</span>
+<span class="sd">                  This method will accept these forms:</span>
+<span class="sd">                    - `topic=&#39;my-topic&#39;`</span>
+<span class="sd">                    - `topic=[&#39;topic-1&#39;, &#39;topic-2&#39;, &#39;topic-3&#39;]`</span>
+<span class="sd">                    - `topic=re.compile(&#39;persistent://public/default/topic-*&#39;)`</span>
+<span class="sd">        * `subscription`: The name of the subscription.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `consumer_type`:</span>
+<span class="sd">          Select the subscription type to be used when subscribing to the topic.</span>
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be received by this consumer.</span>
+<span class="sd">        * `message_listener`:</span>
+<span class="sd">          Sets a message listener for the consumer. When the listener is set,</span>
+<span class="sd">          the application will receive messages through it. Calls to</span>
+<span class="sd">          `consumer.receive()` will not be allowed. The listener function needs</span>
+<span class="sd">          to accept (consumer, message), for example:</span>
+
+<span class="sd">                #!python</span>
+<span class="sd">                def my_listener(consumer, message):</span>
+<span class="sd">                    # process message</span>
+<span class="sd">                    consumer.acknowledge(message)</span>
+
+<span class="sd">        * `receiver_queue_size`:</span>
+<span class="sd">          Sets the size of the consumer receive queue. The consumer receive</span>
+<span class="sd">          queue controls how many messages can be accumulated by the consumer</span>
+<span class="sd">          before the application calls `receive()`. Using a higher value could</span>
+<span class="sd">          potentially increase the consumer throughput at the expense of higher</span>
+<span class="sd">          memory utilization. Setting the consumer queue size to zero decreases</span>
+<span class="sd">          the throughput of the consumer by disabling pre-fetching of messages.</span>
+<span class="sd">          This approach improves the message distribution on shared subscription</span>
+<span class="sd">          by pushing messages only to those consumers that are ready to process</span>
+<span class="sd">          them. Neither receive with timeout nor partitioned topics can be used</span>
+<span class="sd">          if the consumer queue size is zero. The `receive()` function call</span>
+<span class="sd">          should not be interrupted when the consumer queue size is zero. The</span>
+<span class="sd">          default value is 1000 messages and should work well for most use</span>
+<span class="sd">          cases.</span>
+<span class="sd">        * `max_total_receiver_queue_size_across_partitions`</span>
+<span class="sd">          Set the max total receiver queue size across partitions.</span>
+<span class="sd">          This setting will be used to reduce the receiver queue size for individual partitions</span>
+<span class="sd">        * `consumer_name`:</span>
+<span class="sd">          Sets the consumer name.</span>
+<span class="sd">        * `unacked_messages_timeout_ms`:</span>
+<span class="sd">          Sets the timeout in milliseconds for unacknowledged messages. The</span>
+<span class="sd">          timeout needs to be greater than 10 seconds. An exception is thrown if</span>
+<span class="sd">          the given value is less than 10 seconds. If a successful</span>
+<span class="sd">          acknowledgement is not sent within the timeout, all the unacknowledged</span>
+<span class="sd">          messages are redelivered.</span>
+<span class="sd">        * `negative_ack_redelivery_delay_ms`:</span>
+<span class="sd">           The delay after which to redeliver the messages that failed to be</span>
+<span class="sd">           processed (with the `consumer.negative_acknowledge()`)</span>
+<span class="sd">        * `broker_consumer_stats_cache_time_ms`:</span>
+<span class="sd">          Sets the time duration for which the broker-side consumer stats will</span>
+<span class="sd">          be cached in the client.</span>
+<span class="sd">        * `is_read_compacted`:</span>
+<span class="sd">          Selects whether to read the compacted version of the topic</span>
+<span class="sd">        * `properties`:</span>
+<span class="sd">          Sets the properties for the consumer. The properties associated with a consumer</span>
+<span class="sd">          can be used for identify a consumer at broker side.</span>
+<span class="sd">        * `pattern_auto_discovery_period`:</span>
+<span class="sd">          Periods of seconds for consumer to auto discover match topics.</span>
+<span class="sd">        * `initial_position`:</span>
+<span class="sd">          Set the initial position of a consumer  when subscribing to the topic.</span>
+<span class="sd">          It could be either: `InitialPosition.Earliest` or `InitialPosition.Latest`.</span>
+<span class="sd">          Default: `Latest`.</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        * replicate_subscription_state_enabled:</span>
+<span class="sd">          Set whether the subscription status should be replicated.</span>
+<span class="sd">          Default: `False`.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="s1">&#39;subscription_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">ConsumerType</span><span class="p">,</span> <span class="n">consumer_type</span><span class="p">,</span> <span class="s1">&#39;consumer_type&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">&#39;receiver_queue_size&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">,</span>
+                    <span class="s1">&#39;max_total_receiver_queue_size_across_partitions&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">consumer_name</span><span class="p">,</span> <span class="s1">&#39;consumer_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">,</span> <span class="s1">&#39;unacked_messages_timeout_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">,</span> <span class="s1">&#39;broker_consumer_stats_cache_time_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">negative_ack_redelivery_delay_ms</span><span class="p">,</span> <span class="s1">&#39;negative_ack_redelivery_delay_ms&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">pattern_auto_discovery_period</span><span class="p">,</span> <span class="s1">&#39;pattern_auto_discovery_period&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">&#39;is_read_compacted&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">InitialPosition</span><span class="p">,</span> <span class="n">initial_position</span><span class="p">,</span> <span class="s1">&#39;initial_position&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ConsumerConfiguration</span><span class="p">()</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">consumer_type</span><span class="p">(</span><span class="n">consumer_type</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">message_listener</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">message_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">message_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">(</span><span class="n">max_total_receiver_queue_size_across_partitions</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">consumer_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">consumer_name</span><span class="p">(</span><span class="n">consumer_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">unacked_messages_timeout_ms</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">unacked_messages_timeout_ms</span><span class="p">(</span><span class="n">unacked_messages_timeout_ms</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">(</span><span class="n">negative_ack_redelivery_delay_ms</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">(</span><span class="n">broker_consumer_stats_cache_time_ms</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">conf</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">subscription_initial_position</span><span class="p">(</span><span class="n">initial_position</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">conf</span><span class="o">.</span><span class="n">replicate_subscription_state_enabled</span><span class="p">(</span><span class="n">replicate_subscription_state_enabled</span><span class="p">)</span>
+
+        <span class="n">c</span> <span class="o">=</span> <span class="n">Consumer</span><span class="p">()</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+            <span class="c1"># Single topic</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span>
+            <span class="c1"># List of topics</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_topics</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">_retype</span><span class="p">):</span>
+            <span class="c1"># Regex pattern</span>
+            <span class="n">c</span><span class="o">.</span><span class="n">_consumer</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">subscribe_pattern</span><span class="p">(</span><span class="n">topic</span><span class="o">.</span><span class="n">pattern</span><span class="p">,</span> <span class="n">subscription_name</span><span class="p">,</span> <span class="n">conf</span><span [...]
+        <span class="k">else</span><span class="p">:</span>
+            <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;Argument &#39;topic&#39; is expected to be of a type between (str, list, re.pattern)&quot;</span><span class="p">)</span>
+
+        <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">c</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Subscribe to the given topic and subscription combination.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>topic</code>: The name of the topic, list of topics or regex pattern.
+      This method will accept these forms:
+        - <code>topic='my-topic'</code>
+        - <code>topic=['topic-1', 'topic-2', 'topic-3']</code>
+        - <code>topic=re.compile('persistent://public/default/topic-*')</code></li>
+<li><code>subscription</code>: The name of the subscription.</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>consumer_type</code>:
+Select the subscription type to be used when subscribing to the topic.</li>
+<li><code>schema</code>:
+Define the schema of the data that will be received by this consumer.</li>
+<li><p><code>message_listener</code>:
+Sets a message listener for the consumer. When the listener is set,
+the application will receive messages through it. Calls to
+<code>consumer.receive()</code> will not be allowed. The listener function needs
+to accept (consumer, message), for example:</p>
+
+<pre><code>#!python
+def my_listener(consumer, message):
+    # process message
+    consumer.acknowledge(message)
+</code></pre></li>
+<li><p><code>receiver_queue_size</code>:
+Sets the size of the consumer receive queue. The consumer receive
+queue controls how many messages can be accumulated by the consumer
+before the application calls <code>receive()</code>. Using a higher value could
+potentially increase the consumer throughput at the expense of higher
+memory utilization. Setting the consumer queue size to zero decreases
+the throughput of the consumer by disabling pre-fetching of messages.
+This approach improves the message distribution on shared subscription
+by pushing messages only to those consumers that are ready to process
+them. Neither receive with timeout nor partitioned topics can be used
+if the consumer queue size is zero. The <code>receive()</code> function call
+should not be interrupted when the consumer queue size is zero. The
+default value is 1000 messages and should work well for most use
+cases.</p></li>
+<li><code>max_total_receiver_queue_size_across_partitions</code>
+Set the max total receiver queue size across partitions.
+This setting will be used to reduce the receiver queue size for individual partitions</li>
+<li><code>consumer_name</code>:
+Sets the consumer name.</li>
+<li><code>unacked_messages_timeout_ms</code>:
+Sets the timeout in milliseconds for unacknowledged messages. The
+timeout needs to be greater than 10 seconds. An exception is thrown if
+the given value is less than 10 seconds. If a successful
+acknowledgement is not sent within the timeout, all the unacknowledged
+messages are redelivered.</li>
+<li><code>negative_ack_redelivery_delay_ms</code>:
+The delay after which to redeliver the messages that failed to be
+processed (with the <code>consumer.negative_acknowledge()</code>)</li>
+<li><code>broker_consumer_stats_cache_time_ms</code>:
+Sets the time duration for which the broker-side consumer stats will
+be cached in the client.</li>
+<li><code>is_read_compacted</code>:
+Selects whether to read the compacted version of the topic</li>
+<li><code>properties</code>:
+Sets the properties for the consumer. The properties associated with a consumer
+can be used for identify a consumer at broker side.</li>
+<li><code>pattern_auto_discovery_period</code>:
+Periods of seconds for consumer to auto discover match topics.</li>
+<li><code>initial_position</code>:
+Set the initial position of a consumer  when subscribing to the topic.
+It could be either: <code>InitialPosition.Earliest</code> or <code>InitialPosition.Latest</code>.
+Default: <code>Latest</code>.</li>
+<li>crypto_key_reader:
+Symmetric encryption class implementation, configuring public key encryption messages for the producer
+and private key decryption messages for the consumer</li>
+<li>replicate_subscription_state_enabled:
+Set whether the subscription status should be replicated.
+Default: <code>False</code>.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Client.create_reader" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Client.create_reader">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">create_reader</span><span class="signature">(
+    self,
+    topic,
+    start_message_id,
+    schema=&lt;<a href="pulsar/schema/schema.html#BytesSchema">pulsar.schema.schema.BytesSchema</a> object&gt;,
+    reader_listener=None,
+    receiver_queue_size=1000,
+    reader_name=None,
+    subscription_role_prefix=None,
+    is_read_compacted=False,
+    crypto_key_reader=None
+)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">create_reader</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span>
+                      <span class="n">schema</span><span class="o">=</span><span class="n">schema</span><span class="o">.</span><span class="n">BytesSchema</span><span class="p">(),</span>
+                      <span class="n">reader_listener</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">receiver_queue_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">,</span>
+                      <span class="n">reader_name</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">subscription_role_prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                      <span class="n">is_read_compacted</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                      <span class="n">crypto_key_reader</span><span class="o">=</span><span class="kc">None</span>
+                      <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create a reader on a particular topic</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `topic`: The name of the topic.</span>
+<span class="sd">        * `start_message_id`: The initial reader positioning is done by specifying a message id.</span>
+<span class="sd">           The options are:</span>
+<span class="sd">            * `MessageId.earliest`: Start reading from the earliest message available in the topic</span>
+<span class="sd">            * `MessageId.latest`: Start reading from the end topic, only getting messages published</span>
+<span class="sd">               after the reader was created</span>
+<span class="sd">            * `MessageId`: When passing a particular message id, the reader will position itself on</span>
+<span class="sd">               that specific position. The first message to be read will be the message next to the</span>
+<span class="sd">               specified messageId. Message id can be serialized into a string and deserialized</span>
+<span class="sd">               back into a `MessageId` object:</span>
+
+<span class="sd">                   # Serialize to string</span>
+<span class="sd">                   s = msg.message_id().serialize()</span>
+
+<span class="sd">                   # Deserialize from string</span>
+<span class="sd">                   msg_id = MessageId.deserialize(s)</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `schema`:</span>
+<span class="sd">           Define the schema of the data that will be received by this reader.</span>
+<span class="sd">        * `reader_listener`:</span>
+<span class="sd">          Sets a message listener for the reader. When the listener is set,</span>
+<span class="sd">          the application will receive messages through it. Calls to</span>
+<span class="sd">          `reader.read_next()` will not be allowed. The listener function needs</span>
+<span class="sd">          to accept (reader, message), for example:</span>
+
+<span class="sd">                def my_listener(reader, message):</span>
+<span class="sd">                    # process message</span>
+<span class="sd">                    pass</span>
+
+<span class="sd">        * `receiver_queue_size`:</span>
+<span class="sd">          Sets the size of the reader receive queue. The reader receive</span>
+<span class="sd">          queue controls how many messages can be accumulated by the reader</span>
+<span class="sd">          before the application calls `read_next()`. Using a higher value could</span>
+<span class="sd">          potentially increase the reader throughput at the expense of higher</span>
+<span class="sd">          memory utilization.</span>
+<span class="sd">        * `reader_name`:</span>
+<span class="sd">          Sets the reader name.</span>
+<span class="sd">        * `subscription_role_prefix`:</span>
+<span class="sd">          Sets the subscription role prefix.</span>
+<span class="sd">        * `is_read_compacted`:</span>
+<span class="sd">          Selects whether to read the compacted version of the topic</span>
+<span class="sd">        * crypto_key_reader:</span>
+<span class="sd">           Symmetric encryption class implementation, configuring public key encryption messages for the producer</span>
+<span class="sd">           and private key decryption messages for the consumer</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageId</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="s1">&#39;start_message_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="n">_schema</span><span class="o">.</span><span class="n">Schema</span><span class="p">,</span> <span class="n">schema</span><span class="p">,</span> <span class="s1">&#39;schema&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">receiver_queue_size</span><span class="p">,</span> <span class="s1">&#39;receiver_queue_size&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">reader_name</span><span class="p">,</span> <span class="s1">&#39;reader_name&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">subscription_role_prefix</span><span class="p">,</span> <span class="s1">&#39;subscription_role_prefix&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">is_read_compacted</span><span class="p">,</span> <span class="s1">&#39;is_read_compacted&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">CryptoKeyReader</span><span class="p">,</span> <span class="n">crypto_key_reader</span><span class="p">,</span> <span class="s1">&#39;crypto_key_reader&#39;</span><span class="p">)</span>
+
+        <span class="n">conf</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">ReaderConfiguration</span><span class="p">()</span>
+        <span class="k">if</span> <span class="n">reader_listener</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">reader_listener</span><span class="p">(</span><span class="n">_listener_wrapper</span><span class="p">(</span><span class="n">reader_listener</span><span class="p">,</span> <span class="n">schema</span><span class="p">))</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">receiver_queue_size</span><span class="p">(</span><span class="n">receiver_queue_size</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">reader_name</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">reader_name</span><span class="p">(</span><span class="n">reader_name</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">subscription_role_prefix</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">subscription_role_prefix</span><span class="p">(</span><span class="n">subscription_role_prefix</span><span class="p">)</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">schema</span><span class="p">(</span><span class="n">schema</span><span class="o">.</span><span class="n">schema_info</span><span class="p">())</span>
+        <span class="n">conf</span><span class="o">.</span><span class="n">read_compacted</span><span class="p">(</span><span class="n">is_read_compacted</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">crypto_key_reader</span><span class="p">:</span>
+            <span class="n">conf</span><span class="o">.</span><span class="n">crypto_key_reader</span><span class="p">(</span><span class="n">crypto_key_reader</span><span class="o">.</span><span class="n">cryptoKeyReader</span><span class="p">)</span>
+
+        <span class="n">c</span> <span class="o">=</span> <span class="n">Reader</span><span class="p">()</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_reader</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">create_reader</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">start_message_id</span><span class="p">,</span> <span class="n">conf</span><span class="p">)</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_client</span> <span class="o">=</span> <span class="bp">self</span>
+        <span class="n">c</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="n">schema</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">c</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">c</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create a reader on a particular topic</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>topic</code>: The name of the topic.</li>
+<li><p><code>start_message_id</code>: The initial reader positioning is done by specifying a message id.
+The options are:</p>
+
+<ul>
+<li><code><a href="#MessageId.earliest">MessageId.earliest</a></code>: Start reading from the earliest message available in the topic</li>
+<li><code><a href="#MessageId.latest">MessageId.latest</a></code>: Start reading from the end topic, only getting messages published
+after the reader was created</li>
+<li><p><code><a href="#MessageId">MessageId</a></code>: When passing a particular message id, the reader will position itself on
+that specific position. The first message to be read will be the message next to the
+specified messageId. Message id can be serialized into a string and deserialized
+back into a <code><a href="#MessageId">MessageId</a></code> object:</p>
+
+<p># Serialize to string
+   s = msg.message_id().serialize()</p>
+
+<p># Deserialize from string
+   msg_id = <a href="#MessageId.deserialize">MessageId.deserialize</a>(s)</p></li>
+</ul></li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>schema</code>:
+Define the schema of the data that will be received by this reader.</li>
+<li><p><code>reader_listener</code>:
+Sets a message listener for the reader. When the listener is set,
+the application will receive messages through it. Calls to
+<code>reader.read_next()</code> will not be allowed. The listener function needs
+to accept (reader, message), for example:</p>
+
+<pre><code>def my_listener(reader, message):
+    # process message
+    pass
+</code></pre></li>
+<li><p><code>receiver_queue_size</code>:
+Sets the size of the reader receive queue. The reader receive
+queue controls how many messages can be accumulated by the reader
+before the application calls <code>read_next()</code>. Using a higher value could
+potentially increase the reader throughput at the expense of higher
+memory utilization.</p></li>
+<li><code>reader_name</code>:
+Sets the reader name.</li>
+<li><code>subscription_role_prefix</code>:
+Sets the subscription role prefix.</li>
+<li><code>is_read_compacted</code>:
+Selects whether to read the compacted version of the topic</li>
+<li>crypto_key_reader:
+Symmetric encryption class implementation, configuring public key encryption messages for the producer
+and private key decryption messages for the consumer</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Client.get_topic_partitions" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Client.get_topic_partitions">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">get_topic_partitions</span><span class="signature">(self, topic)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">get_topic_partitions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the list of partitions for a given topic.</span>
+
+<span class="sd">        If the topic is partitioned, this will return a list of partition names. If the topic is not</span>
+<span class="sd">        partitioned, the returned list will contain the topic name itself.</span>
+
+<span class="sd">        This can be used to discover the partitions and create Reader, Consumer or Producer</span>
+<span class="sd">        instances directly on a particular partition.</span>
+<span class="sd">        :param topic: the topic name to lookup</span>
+<span class="sd">        :return: a list of partition name</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">topic</span><span class="p">,</span> <span class="s1">&#39;topic&#39;</span><span class="p">)</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">get_topic_partitions</span><span class="p">(</span><span class="n">topic</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the list of partitions for a given topic.</p>
+
+<p>If the topic is partitioned, this will return a list of partition names. If the topic is not
+partitioned, the returned list will contain the topic name itself.</p>
+
+<p>This can be used to discover the partitions and create Reader, Consumer or Producer
+instances directly on a particular partition.</p>
+
+<h6 id="parameters">Parameters</h6>
+
+<ul>
+<li><strong>topic</strong>:  the topic name to lookup</li>
+</ul>
+
+<h6 id="returns">Returns</h6>
+
+<blockquote>
+  <p>a list of partition name</p>
+</blockquote>
+</div>
+
+
+                            </div>
+                            <div id="Client.shutdown" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Client.shutdown">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">shutdown</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">shutdown</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Perform immediate shutdown of Pulsar client.</span>
+
+<span class="sd">        Release all resources and close all producer, consumer, and readers without waiting</span>
+<span class="sd">        for ongoing operations to complete.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">shutdown</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Perform immediate shutdown of Pulsar client.</p>
+
+<p>Release all resources and close all producer, consumer, and readers without waiting
+for ongoing operations to complete.</p>
+</div>
+
+
+                            </div>
+                            <div id="Client.close" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Client.close">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">close</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the client and all the associated producers and consumers</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Close the client and all the associated producers and consumers</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="Producer">
+                                <div class="attr class">
+        <a class="headerlink" href="#Producer">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Producer</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Producer</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    The Pulsar message producer, used to publish messages on a topic.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic which producer is publishing to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">producer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the producer name which could have been assigned by the</span>
+<span class="sd">        system or specified by the client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">producer_name</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">last_sequence_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the last sequence id that was published by this producer.</span>
+
+<span class="sd">        This represent either the automatically assigned or custom sequence id</span>
+<span class="sd">        (set on the `MessageBuilder`) that was published and acknowledged by the broker.</span>
+
+<span class="sd">        After recreating a producer with the same producer name, this will return the</span>
+<span class="sd">        last message that was published in the previous producer session, or -1 if</span>
+<span class="sd">        there no message was ever published.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">last_sequence_id</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span>
+             <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+             <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Publish a message on the topic. Blocks until the message is acknowledged</span>
+
+<span class="sd">        Returns a `MessageId` object that represents where the message is persisted.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `content`:</span>
+<span class="sd">          A `bytes` object with the message payload.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `properties`:</span>
+<span class="sd">          A dict of application-defined string properties.</span>
+<span class="sd">        * `partition_key`:</span>
+<span class="sd">          Sets the partition key for message routing. A hash of this key is used</span>
+<span class="sd">          to determine the message&#39;s topic partition.</span>
+<span class="sd">        * `sequence_id`:</span>
+<span class="sd">          Specify a custom sequence id for the message being published.</span>
+<span class="sd">        * `replication_clusters`:</span>
+<span class="sd">          Override namespace replication clusters. Note that it is the caller&#39;s</span>
+<span class="sd">          responsibility to provide valid cluster names and that all clusters</span>
+<span class="sd">          have been previously configured as topics. Given an empty list,</span>
+<span class="sd">          the message will replicate according to the namespace configuration.</span>
+<span class="sd">        * `disable_replication`:</span>
+<span class="sd">          Do not replicate this message.</span>
+<span class="sd">        * `event_timestamp`:</span>
+<span class="sd">          Timestamp in millis of the timestamp of event creation</span>
+<span class="sd">        * `deliver_at`:</span>
+<span class="sd">          Specify the this message should not be delivered earlier than the</span>
+<span class="sd">          specified timestamp.</span>
+<span class="sd">          The timestamp is milliseconds and based on UTC</span>
+<span class="sd">        * `deliver_after`:</span>
+<span class="sd">          Specify a delay in timedelta for the delivery of the messages.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                              <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                              <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+
+    <span class="k">def</span> <span class="nf">send_async</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span>
+                   <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                   <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Send a message asynchronously.</span>
+
+<span class="sd">        The `callback` will be invoked once the message has been acknowledged</span>
+<span class="sd">        by the broker.</span>
+
+<span class="sd">        Example:</span>
+
+<span class="sd">            #!python</span>
+<span class="sd">            def callback(res, msg_id):</span>
+<span class="sd">                print(&#39;Message published: %s&#39; % res)</span>
+
+<span class="sd">            producer.send_async(msg, callback)</span>
+
+<span class="sd">        When the producer queue is full, by default the message will be rejected</span>
+<span class="sd">        and the callback invoked with an error code.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `content`:</span>
+<span class="sd">          A `bytes` object with the message payload.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `properties`:</span>
+<span class="sd">          A dict of application0-defined string properties.</span>
+<span class="sd">        * `partition_key`:</span>
+<span class="sd">          Sets the partition key for the message routing. A hash of this key is</span>
+<span class="sd">          used to determine the message&#39;s topic partition.</span>
+<span class="sd">        * `sequence_id`:</span>
+<span class="sd">          Specify a custom sequence id for the message being published.</span>
+<span class="sd">        * `replication_clusters`: Override namespace replication clusters. Note</span>
+<span class="sd">          that it is the caller&#39;s responsibility to provide valid cluster names</span>
+<span class="sd">          and that all clusters have been previously configured as topics.</span>
+<span class="sd">          Given an empty list, the message will replicate per the namespace</span>
+<span class="sd">          configuration.</span>
+<span class="sd">        * `disable_replication`:</span>
+<span class="sd">          Do not replicate this message.</span>
+<span class="sd">        * `event_timestamp`:</span>
+<span class="sd">          Timestamp in millis of the timestamp of event creation</span>
+<span class="sd">        * `deliver_at`:</span>
+<span class="sd">          Specify the this message should not be delivered earlier than the</span>
+<span class="sd">          specified timestamp.</span>
+<span class="sd">          The timestamp is milliseconds and based on UTC</span>
+<span class="sd">        * `deliver_after`:</span>
+<span class="sd">          Specify a delay in timedelta for the delivery of the messages.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                              <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                              <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send_async</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+
+
+    <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Flush all the messages buffered in the client and wait until all messages have been</span>
+<span class="sd">        successfully persisted</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the producer.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">_build_msg</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                   <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                   <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">):</span>
+        <span class="n">data</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
+
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bytes</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="s1">&#39;data&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">dict</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="s1">&#39;properties&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="s1">&#39;partition_key&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span> <span class="s1">&#39;sequence_id&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">replication_clusters</span><span class="p">,</span> <span class="s1">&#39;replication_clusters&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">bool</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="s1">&#39;disable_replication&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span> <span class="s1">&#39;event_timestamp&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">deliver_at</span><span class="p">,</span> <span class="s1">&#39;deliver_at&#39;</span><span class="p">)</span>
+        <span class="n">_check_type_or_none</span><span class="p">(</span><span class="n">timedelta</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">,</span> <span class="s1">&#39;deliver_after&#39;</span><span class="p">)</span>
+
+        <span class="n">mb</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">MessageBuilder</span><span class="p">()</span>
+        <span class="n">mb</span><span class="o">.</span><span class="n">content</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">properties</span><span class="p">:</span>
+            <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">properties</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                <span class="n">mb</span><span class="o">.</span><span class="n">property</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">partition_key</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">partition_key</span><span class="p">(</span><span class="n">partition_key</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">sequence_id</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">sequence_id</span><span class="p">(</span><span class="n">sequence_id</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">replication_clusters</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">replication_clusters</span><span class="p">(</span><span class="n">replication_clusters</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">disable_replication</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">disable_replication</span><span class="p">(</span><span class="n">disable_replication</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">event_timestamp</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">event_timestamp</span><span class="p">(</span><span class="n">event_timestamp</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">deliver_at</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">deliver_at</span><span class="p">(</span><span class="n">deliver_at</span><span class="p">)</span>
+        <span class="k">if</span> <span class="n">deliver_after</span><span class="p">:</span>
+            <span class="n">mb</span><span class="o">.</span><span class="n">deliver_after</span><span class="p">(</span><span class="n">deliver_after</span><span class="p">)</span>
+
+        <span class="k">return</span> <span class="n">mb</span><span class="o">.</span><span class="n">build</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the producer is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>The Pulsar message producer, used to publish messages on a topic.</p>
+</div>
+
+
+                            <div id="Producer.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Producer</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="Producer.topic" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.topic">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">topic</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic which producer is publishing to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the topic which producer is publishing to</p>
+</div>
+
+
+                            </div>
+                            <div id="Producer.producer_name" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.producer_name">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">producer_name</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">producer_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the producer name which could have been assigned by the</span>
+<span class="sd">        system or specified by the client</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">producer_name</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the producer name which could have been assigned by the
+system or specified by the client</p>
+</div>
+
+
+                            </div>
+                            <div id="Producer.last_sequence_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.last_sequence_id">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">last_sequence_id</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">last_sequence_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Get the last sequence id that was published by this producer.</span>
+
+<span class="sd">        This represent either the automatically assigned or custom sequence id</span>
+<span class="sd">        (set on the `MessageBuilder`) that was published and acknowledged by the broker.</span>
+
+<span class="sd">        After recreating a producer with the same producer name, this will return the</span>
+<span class="sd">        last message that was published in the previous producer session, or -1 if</span>
+<span class="sd">        there no message was ever published.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">last_sequence_id</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Get the last sequence id that was published by this producer.</p>
+
+<p>This represent either the automatically assigned or custom sequence id
+(set on the <code>MessageBuilder</code>) that was published and acknowledged by the broker.</p>
+
+<p>After recreating a producer with the same producer name, this will return the
+last message that was published in the previous producer session, or -1 if
+there no message was ever published.</p>
+</div>
+
+
+                            </div>
+                            <div id="Producer.send" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.send">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">send</span><span class="signature">(
+    self,
+    content,
+    properties=None,
+    partition_key=None,
+    sequence_id=None,
+    replication_clusters=None,
+    disable_replication=False,
+    event_timestamp=None,
+    deliver_at=None,
+    deliver_after=None
+)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">send</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span>
+             <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+             <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+             <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Publish a message on the topic. Blocks until the message is acknowledged</span>
+
+<span class="sd">        Returns a `MessageId` object that represents where the message is persisted.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `content`:</span>
+<span class="sd">          A `bytes` object with the message payload.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `properties`:</span>
+<span class="sd">          A dict of application-defined string properties.</span>
+<span class="sd">        * `partition_key`:</span>
+<span class="sd">          Sets the partition key for message routing. A hash of this key is used</span>
+<span class="sd">          to determine the message&#39;s topic partition.</span>
+<span class="sd">        * `sequence_id`:</span>
+<span class="sd">          Specify a custom sequence id for the message being published.</span>
+<span class="sd">        * `replication_clusters`:</span>
+<span class="sd">          Override namespace replication clusters. Note that it is the caller&#39;s</span>
+<span class="sd">          responsibility to provide valid cluster names and that all clusters</span>
+<span class="sd">          have been previously configured as topics. Given an empty list,</span>
+<span class="sd">          the message will replicate according to the namespace configuration.</span>
+<span class="sd">        * `disable_replication`:</span>
+<span class="sd">          Do not replicate this message.</span>
+<span class="sd">        * `event_timestamp`:</span>
+<span class="sd">          Timestamp in millis of the timestamp of event creation</span>
+<span class="sd">        * `deliver_at`:</span>
+<span class="sd">          Specify the this message should not be delivered earlier than the</span>
+<span class="sd">          specified timestamp.</span>
+<span class="sd">          The timestamp is milliseconds and based on UTC</span>
+<span class="sd">        * `deliver_after`:</span>
+<span class="sd">          Specify a delay in timedelta for the delivery of the messages.</span>
+
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                              <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                              <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+        <span class="k">return</span> <span class="n">MessageId</span><span class="o">.</span><span class="n">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Publish a message on the topic. Blocks until the message is acknowledged</p>
+
+<p>Returns a <code><a href="#MessageId">MessageId</a></code> object that represents where the message is persisted.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>content</code>:
+A <code>bytes</code> object with the message payload.</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>properties</code>:
+A dict of application-defined string properties.</li>
+<li><code>partition_key</code>:
+Sets the partition key for message routing. A hash of this key is used
+to determine the message's topic partition.</li>
+<li><code>sequence_id</code>:
+Specify a custom sequence id for the message being published.</li>
+<li><code>replication_clusters</code>:
+Override namespace replication clusters. Note that it is the caller's
+responsibility to provide valid cluster names and that all clusters
+have been previously configured as topics. Given an empty list,
+the message will replicate according to the namespace configuration.</li>
+<li><code>disable_replication</code>:
+Do not replicate this message.</li>
+<li><code>event_timestamp</code>:
+Timestamp in millis of the timestamp of event creation</li>
+<li><code>deliver_at</code>:
+Specify the this message should not be delivered earlier than the
+specified timestamp.
+The timestamp is milliseconds and based on UTC</li>
+<li><code>deliver_after</code>:
+Specify a delay in timedelta for the delivery of the messages.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Producer.send_async" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.send_async">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">send_async</span><span class="signature">(
+    self,
+    content,
+    callback,
+    properties=None,
+    partition_key=None,
+    sequence_id=None,
+    replication_clusters=None,
+    disable_replication=False,
+    event_timestamp=None,
+    deliver_at=None,
+    deliver_after=None
+)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">send_async</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">content</span><span class="p">,</span> <span class="n">callback</span><span class="p">,</span>
+                   <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">partition_key</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">sequence_id</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">replication_clusters</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">disable_replication</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
+                   <span class="n">event_timestamp</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">deliver_at</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="n">deliver_after</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
+                   <span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Send a message asynchronously.</span>
+
+<span class="sd">        The `callback` will be invoked once the message has been acknowledged</span>
+<span class="sd">        by the broker.</span>
+
+<span class="sd">        Example:</span>
+
+<span class="sd">            #!python</span>
+<span class="sd">            def callback(res, msg_id):</span>
+<span class="sd">                print(&#39;Message published: %s&#39; % res)</span>
+
+<span class="sd">            producer.send_async(msg, callback)</span>
+
+<span class="sd">        When the producer queue is full, by default the message will be rejected</span>
+<span class="sd">        and the callback invoked with an error code.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `content`:</span>
+<span class="sd">          A `bytes` object with the message payload.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `properties`:</span>
+<span class="sd">          A dict of application0-defined string properties.</span>
+<span class="sd">        * `partition_key`:</span>
+<span class="sd">          Sets the partition key for the message routing. A hash of this key is</span>
+<span class="sd">          used to determine the message&#39;s topic partition.</span>
+<span class="sd">        * `sequence_id`:</span>
+<span class="sd">          Specify a custom sequence id for the message being published.</span>
+<span class="sd">        * `replication_clusters`: Override namespace replication clusters. Note</span>
+<span class="sd">          that it is the caller&#39;s responsibility to provide valid cluster names</span>
+<span class="sd">          and that all clusters have been previously configured as topics.</span>
+<span class="sd">          Given an empty list, the message will replicate per the namespace</span>
+<span class="sd">          configuration.</span>
+<span class="sd">        * `disable_replication`:</span>
+<span class="sd">          Do not replicate this message.</span>
+<span class="sd">        * `event_timestamp`:</span>
+<span class="sd">          Timestamp in millis of the timestamp of event creation</span>
+<span class="sd">        * `deliver_at`:</span>
+<span class="sd">          Specify the this message should not be delivered earlier than the</span>
+<span class="sd">          specified timestamp.</span>
+<span class="sd">          The timestamp is milliseconds and based on UTC</span>
+<span class="sd">        * `deliver_after`:</span>
+<span class="sd">          Specify a delay in timedelta for the delivery of the messages.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_build_msg</span><span class="p">(</span><span class="n">content</span><span class="p">,</span> <span class="n">properties</span><span class="p">,</span> <span class="n">partition_key</span><span class="p">,</span> <span class="n">sequence_id</span><span class="p">,</span>
+                              <span class="n">replication_clusters</span><span class="p">,</span> <span class="n">disable_replication</span><span class="p">,</span> <span class="n">event_timestamp</span><span class="p">,</span>
+                              <span class="n">deliver_at</span><span class="p">,</span> <span class="n">deliver_after</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">send_async</span><span class="p">(</span><span class="n">msg</span><span class="p">,</span> <span class="n">callback</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Send a message asynchronously.</p>
+
+<p>The <code>callback</code> will be invoked once the message has been acknowledged
+by the broker.</p>
+
+<p>Example:</p>
+
+<pre><code>#!python
+def callback(res, msg_id):
+    print('Message published: %s' % res)
+
+producer.send_async(msg, callback)
+</code></pre>
+
+<p>When the producer queue is full, by default the message will be rejected
+and the callback invoked with an error code.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>content</code>:
+A <code>bytes</code> object with the message payload.</li>
+</ul>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>properties</code>:
+A dict of application0-defined string properties.</li>
+<li><code>partition_key</code>:
+Sets the partition key for the message routing. A hash of this key is
+used to determine the message's topic partition.</li>
+<li><code>sequence_id</code>:
+Specify a custom sequence id for the message being published.</li>
+<li><code>replication_clusters</code>: Override namespace replication clusters. Note
+that it is the caller's responsibility to provide valid cluster names
+and that all clusters have been previously configured as topics.
+Given an empty list, the message will replicate per the namespace
+configuration.</li>
+<li><code>disable_replication</code>:
+Do not replicate this message.</li>
+<li><code>event_timestamp</code>:
+Timestamp in millis of the timestamp of event creation</li>
+<li><code>deliver_at</code>:
+Specify the this message should not be delivered earlier than the
+specified timestamp.
+The timestamp is milliseconds and based on UTC</li>
+<li><code>deliver_after</code>:
+Specify a delay in timedelta for the delivery of the messages.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Producer.flush" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.flush">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">flush</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">flush</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Flush all the messages buffered in the client and wait until all messages have been</span>
+<span class="sd">        successfully persisted</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">flush</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Flush all the messages buffered in the client and wait until all messages have been
+successfully persisted</p>
+</div>
+
+
+                            </div>
+                            <div id="Producer.close" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.close">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">close</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the producer.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Close the producer.</p>
+</div>
+
+
+                            </div>
+                            <div id="Producer.is_connected" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Producer.is_connected">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">is_connected</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the producer is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_producer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Check if the producer is connected or not.</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="Consumer">
+                                <div class="attr class">
+        <a class="headerlink" href="#Consumer">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Consumer</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Consumer</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Pulsar consumer.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic this consumer is subscribed to.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">subscription_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the subscription name.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">subscription_name</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Unsubscribe the current consumer from the topic.</span>
+
+<span class="sd">        This method will block until the operation is completed. Once the</span>
+<span class="sd">        consumer is unsubscribed, no more messages will be received and</span>
+<span class="sd">        subsequent new messages will not be retained for this consumer.</span>
+
+<span class="sd">        This consumer object cannot be reused.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Receive a single message.</span>
+
+<span class="sd">        If a message is not immediately available, this method will block until</span>
+<span class="sd">        a new message is available.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `timeout_millis`:</span>
+<span class="sd">          If specified, the receive will raise an exception if a message is not</span>
+<span class="sd">          available within the timeout.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">&#39;timeout_millis&#39;</span><span class="p">)</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+        <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+        <span class="k">return</span> <span class="n">m</span>
+
+    <span class="k">def</span> <span class="nf">acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the reception of a single message.</span>
+
+<span class="sd">        This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd">        After that, the message will not be re-delivered to this consumer.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">acknowledge_cumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the reception of all the messages in the stream up to (and</span>
+<span class="sd">        including) the provided message.</span>
+
+<span class="sd">        This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd">        After that, the messages will not be re-delivered to this consumer.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">negative_acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the failure to process a single message.</span>
+
+<span class="sd">        When a message is &quot;negatively acked&quot; it will be marked for redelivery after</span>
+<span class="sd">        some fixed delay. The delay is configurable when constructing the consumer</span>
+<span class="sd">        with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</span>
+
+<span class="sd">        This call is not blocking.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">pause_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Pause receiving messages via the `message_listener` until</span>
+<span class="sd">        `resume_message_listener()` is called.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">pause_message_listener</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">resume_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Resume receiving the messages via the message listener.</span>
+<span class="sd">        Asynchronously receive all the messages enqueued from the time</span>
+<span class="sd">        `pause_message_listener()` was called.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">resume_message_listener</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">redeliver_unacknowledged_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Redelivers all the unacknowledged messages. In failover mode, the</span>
+<span class="sd">        request is ignored if the consumer is not active for the given topic. In</span>
+<span class="sd">        shared mode, the consumer&#39;s messages to be redelivered are distributed</span>
+<span class="sd">        across all the connected consumers. This is a non-blocking call and</span>
+<span class="sd">        doesn&#39;t throw an exception. In case the connection breaks, the messages</span>
+<span class="sd">        are redelivered after reconnect.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">redeliver_unacknowledged_messages</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Reset the subscription associated with this consumer to a specific message id or publish timestamp.</span>
+<span class="sd">        The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd">        Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd">        seek() on the individual partitions.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The message id for seek, OR an integer event time to seek to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the consumer.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the consumer is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Pulsar consumer.</p>
+</div>
+
+
+                            <div id="Consumer.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Consumer</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="Consumer.topic" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.topic">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">topic</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic this consumer is subscribed to.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the topic this consumer is subscribed to.</p>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.subscription_name" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.subscription_name">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">subscription_name</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">subscription_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the subscription name.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">subscription_name</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the subscription name.</p>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.unsubscribe" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.unsubscribe">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">unsubscribe</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">unsubscribe</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Unsubscribe the current consumer from the topic.</span>
+
+<span class="sd">        This method will block until the operation is completed. Once the</span>
+<span class="sd">        consumer is unsubscribed, no more messages will be received and</span>
+<span class="sd">        subsequent new messages will not be retained for this consumer.</span>
+
+<span class="sd">        This consumer object cannot be reused.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">unsubscribe</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Unsubscribe the current consumer from the topic.</p>
+
+<p>This method will block until the operation is completed. Once the
+consumer is unsubscribed, no more messages will be received and
+subsequent new messages will not be retained for this consumer.</p>
+
+<p>This consumer object cannot be reused.</p>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.receive" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.receive">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">receive</span><span class="signature">(self, timeout_millis=None)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">receive</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Receive a single message.</span>
+
+<span class="sd">        If a message is not immediately available, this method will block until</span>
+<span class="sd">        a new message is available.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `timeout_millis`:</span>
+<span class="sd">          If specified, the receive will raise an exception if a message is not</span>
+<span class="sd">          available within the timeout.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">&#39;timeout_millis&#39;</span><span class="p">)</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">receive</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+        <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+        <span class="k">return</span> <span class="n">m</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Receive a single message.</p>
+
+<p>If a message is not immediately available, this method will block until
+a new message is available.</p>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>timeout_millis</code>:
+If specified, the receive will raise an exception if a message is not
+available within the timeout.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.acknowledge" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.acknowledge">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">acknowledge</span><span class="signature">(self, message)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the reception of a single message.</span>
+
+<span class="sd">        This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd">        After that, the message will not be re-delivered to this consumer.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Acknowledge the reception of a single message.</p>
+
+<p>This method will block until an acknowledgement is sent to the broker.
+After that, the message will not be re-delivered to this consumer.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The received message or message id.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.acknowledge_cumulative" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.acknowledge_cumulative">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">acknowledge_cumulative</span><span class="signature">(self, message)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">acknowledge_cumulative</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the reception of all the messages in the stream up to (and</span>
+<span class="sd">        including) the provided message.</span>
+
+<span class="sd">        This method will block until an acknowledgement is sent to the broker.</span>
+<span class="sd">        After that, the messages will not be re-delivered to this consumer.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">acknowledge_cumulative</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Acknowledge the reception of all the messages in the stream up to (and
+including) the provided message.</p>
+
+<p>This method will block until an acknowledgement is sent to the broker.
+After that, the messages will not be re-delivered to this consumer.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The received message or message id.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.negative_acknowledge" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.negative_acknowledge">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">negative_acknowledge</span><span class="signature">(self, message)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">negative_acknowledge</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Acknowledge the failure to process a single message.</span>
+
+<span class="sd">        When a message is &quot;negatively acked&quot; it will be marked for redelivery after</span>
+<span class="sd">        some fixed delay. The delay is configurable when constructing the consumer</span>
+<span class="sd">        with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</span>
+
+<span class="sd">        This call is not blocking.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The received message or message id.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">Message</span><span class="p">):</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="o">.</span><span class="n">_message</span><span class="p">)</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">negative_acknowledge</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Acknowledge the failure to process a single message.</p>
+
+<p>When a message is "negatively acked" it will be marked for redelivery after
+some fixed delay. The delay is configurable when constructing the consumer
+with {@link ConsumerConfiguration#setNegativeAckRedeliveryDelayMs}.</p>
+
+<p>This call is not blocking.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The received message or message id.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.pause_message_listener" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.pause_message_listener">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">pause_message_listener</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">pause_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Pause receiving messages via the `message_listener` until</span>
+<span class="sd">        `resume_message_listener()` is called.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">pause_message_listener</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Pause receiving messages via the <code>message_listener</code> until
+<code><a href="#Consumer.resume_message_listener">resume_message_listener()</a></code> is called.</p>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.resume_message_listener" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.resume_message_listener">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">resume_message_listener</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">resume_message_listener</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Resume receiving the messages via the message listener.</span>
+<span class="sd">        Asynchronously receive all the messages enqueued from the time</span>
+<span class="sd">        `pause_message_listener()` was called.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">resume_message_listener</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Resume receiving the messages via the message listener.
+Asynchronously receive all the messages enqueued from the time
+<code><a href="#Consumer.pause_message_listener">pause_message_listener()</a></code> was called.</p>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.redeliver_unacknowledged_messages" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.redeliver_unacknowledged_messages">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">redeliver_unacknowledged_messages</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">redeliver_unacknowledged_messages</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Redelivers all the unacknowledged messages. In failover mode, the</span>
+<span class="sd">        request is ignored if the consumer is not active for the given topic. In</span>
+<span class="sd">        shared mode, the consumer&#39;s messages to be redelivered are distributed</span>
+<span class="sd">        across all the connected consumers. This is a non-blocking call and</span>
+<span class="sd">        doesn&#39;t throw an exception. In case the connection breaks, the messages</span>
+<span class="sd">        are redelivered after reconnect.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">redeliver_unacknowledged_messages</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Redelivers all the unacknowledged messages. In failover mode, the
+request is ignored if the consumer is not active for the given topic. In
+shared mode, the consumer's messages to be redelivered are distributed
+across all the connected consumers. This is a non-blocking call and
+doesn't throw an exception. In case the connection breaks, the messages
+are redelivered after reconnect.</p>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.seek" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.seek">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">seek</span><span class="signature">(self, messageid)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Reset the subscription associated with this consumer to a specific message id or publish timestamp.</span>
+<span class="sd">        The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd">        Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd">        seek() on the individual partitions.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The message id for seek, OR an integer event time to seek to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Reset the subscription associated with this consumer to a specific message id or publish timestamp.
+The message id can either be a specific message or represent the first or last messages in the topic.
+Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the
+seek() on the individual partitions.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The message id for seek, OR an integer event time to seek to</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.close" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.close">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">close</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the consumer.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Close the consumer.</p>
+</div>
+
+
+                            </div>
+                            <div id="Consumer.is_connected" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Consumer.is_connected">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">is_connected</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the consumer is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_consumer</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Check if the consumer is connected or not.</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="Reader">
+                                <div class="attr class">
+        <a class="headerlink" href="#Reader">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Reader</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Reader</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Pulsar topic reader.</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+
+    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic this reader is reading from.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+
+    <span class="k">def</span> <span class="nf">read_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Read a single message.</span>
+
+<span class="sd">        If a message is not immediately available, this method will block until</span>
+<span class="sd">        a new message is available.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `timeout_millis`:</span>
+<span class="sd">          If specified, the receive will raise an exception if a message is not</span>
+<span class="sd">          available within the timeout.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">&#39;timeout_millis&#39;</span><span class="p">)</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+        <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+        <span class="k">return</span> <span class="n">m</span>
+
+    <span class="k">def</span> <span class="nf">has_message_available</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if there is any message available to read from the current position.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">has_message_available</span><span class="p">();</span>
+
+    <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Reset this reader to a specific message id or publish timestamp.</span>
+<span class="sd">        The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd">        Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd">        seek() on the individual partitions.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The message id for seek, OR an integer event time to seek to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the reader.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+
+    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the reader is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Pulsar topic reader.</p>
+</div>
+
+
+                            <div id="Reader.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Reader.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Reader</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="Reader.topic" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Reader.topic">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">topic</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Return the topic this reader is reading from.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">topic</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the topic this reader is reading from.</p>
+</div>
+
+
+                            </div>
+                            <div id="Reader.read_next" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Reader.read_next">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">read_next</span><span class="signature">(self, timeout_millis=None)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">read_next</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Read a single message.</span>
+
+<span class="sd">        If a message is not immediately available, this method will block until</span>
+<span class="sd">        a new message is available.</span>
+
+<span class="sd">        **Options**</span>
+
+<span class="sd">        * `timeout_millis`:</span>
+<span class="sd">          If specified, the receive will raise an exception if a message is not</span>
+<span class="sd">          available within the timeout.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">if</span> <span class="n">timeout_millis</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">()</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">_check_type</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">timeout_millis</span><span class="p">,</span> <span class="s1">&#39;timeout_millis&#39;</span><span class="p">)</span>
+            <span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">read_next</span><span class="p">(</span><span class="n">timeout_millis</span><span class="p">)</span>
+
+        <span class="n">m</span> <span class="o">=</span> <span class="n">Message</span><span class="p">()</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_message</span> <span class="o">=</span> <span class="n">msg</span>
+        <span class="n">m</span><span class="o">.</span><span class="n">_schema</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_schema</span>
+        <span class="k">return</span> <span class="n">m</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Read a single message.</p>
+
+<p>If a message is not immediately available, this method will block until
+a new message is available.</p>
+
+<p><strong>Options</strong></p>
+
+<ul>
+<li><code>timeout_millis</code>:
+If specified, the receive will raise an exception if a message is not
+available within the timeout.</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Reader.has_message_available" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Reader.has_message_available">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">has_message_available</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">has_message_available</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if there is any message available to read from the current position.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">has_message_available</span><span class="p">();</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Check if there is any message available to read from the current position.</p>
+</div>
+
+
+                            </div>
+                            <div id="Reader.seek" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Reader.seek">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">seek</span><span class="signature">(self, messageid)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">seek</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">messageid</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Reset this reader to a specific message id or publish timestamp.</span>
+<span class="sd">        The message id can either be a specific message or represent the first or last messages in the topic.</span>
+<span class="sd">        Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the</span>
+<span class="sd">        seek() on the individual partitions.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `message`:</span>
+<span class="sd">          The message id for seek, OR an integer event time to seek to</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">seek</span><span class="p">(</span><span class="n">messageid</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Reset this reader to a specific message id or publish timestamp.
+The message id can either be a specific message or represent the first or last messages in the topic.
+Note: this operation can only be done on non-partitioned topics. For these, one can rather perform the
+seek() on the individual partitions.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>message</code>:
+The message id for seek, OR an integer event time to seek to</li>
+</ul>
+</div>
+
+
+                            </div>
+                            <div id="Reader.close" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Reader.close">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">close</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">close</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Close the reader.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_client</span><span class="o">.</span><span class="n">_consumers</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Close the reader.</p>
+</div>
+
+
+                            </div>
+                            <div id="Reader.is_connected" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Reader.is_connected">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">is_connected</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="nf">is_connected</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Check if the reader is connected or not.</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_reader</span><span class="o">.</span><span class="n">is_connected</span><span class="p">()</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Check if the reader is connected or not.</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="CryptoKeyReader">
+                                <div class="attr class">
+        <a class="headerlink" href="#CryptoKeyReader">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">CryptoKeyReader</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">CryptoKeyReader</span><span class="p">:</span>
+    <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">    Default crypto key reader implementation</span>
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create crypto key reader.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `public_key_path`: Path to the public key</span>
+<span class="sd">        * `private_key_path`: Path to private key</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="s1">&#39;public_key_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">&#39;private_key_path&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">cryptoKeyReader</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">CryptoKeyReader</span><span class="p">(</span><span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Default crypto key reader implementation</p>
+</div>
+
+
+                            <div id="CryptoKeyReader.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#CryptoKeyReader.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">CryptoKeyReader</span><span class="signature">(public_key_path, private_key_path)</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">):</span>
+        <span class="sd">&quot;&quot;&quot;</span>
+<span class="sd">        Create crypto key reader.</span>
+
+<span class="sd">        **Args**</span>
+
+<span class="sd">        * `public_key_path`: Path to the public key</span>
+<span class="sd">        * `private_key_path`: Path to private key</span>
+<span class="sd">        &quot;&quot;&quot;</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">public_key_path</span><span class="p">,</span> <span class="s1">&#39;public_key_path&#39;</span><span class="p">)</span>
+        <span class="n">_check_type</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">,</span> <span class="s1">&#39;private_key_path&#39;</span><span class="p">)</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">cryptoKeyReader</span> <span class="o">=</span> <span class="n">_pulsar</span><span class="o">.</span><span class="n">CryptoKeyReader</span><span class="p">(</span><span class="n">public_key_path</span><span class="p">,</span> <span class="n">private_key_path</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Create crypto key reader.</p>
+
+<p><strong>Args</strong></p>
+
+<ul>
+<li><code>public_key_path</code>: Path to the public key</li>
+<li><code>private_key_path</code>: Path to private key</li>
+</ul>
+</div>
+
+
+                            </div>
+                </section>
+    </main>
+<script>
+    function escapeHTML(html) {
+        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+    }
+
+    const originalContent = document.querySelector("main.pdoc");
+    let currentContent = originalContent;
+
+    function setContent(innerHTML) {
+        let elem;
+        if (innerHTML) {
+            elem = document.createElement("main");
+            elem.classList.add("pdoc");
+            elem.innerHTML = innerHTML;
+        } else {
+            elem = originalContent;
+        }
+        if (currentContent !== elem) {
+            currentContent.replaceWith(elem);
+            currentContent = elem;
+        }
+    }
+
+    function getSearchTerm() {
+        return (new URL(window.location)).searchParams.get("search");
+    }
+
+    const searchBox = document.querySelector(".pdoc input[type=search]");
+    searchBox.addEventListener("input", function () {
+        let url = new URL(window.location);
+        if (searchBox.value.trim()) {
+            url.hash = "";
+            url.searchParams.set("search", searchBox.value);
+        } else {
+            url.searchParams.delete("search");
+        }
+        history.replaceState("", "", url.toString());
+        onInput();
+    });
+    window.addEventListener("popstate", onInput);
+
+
+    let search, searchErr;
+
+    async function initialize() {
+        try {
+            search = await new Promise((resolve, reject) => {
+                const script = document.createElement("script");
+                script.type = "text/javascript";
+                script.async = true;
+                script.onload = () => resolve(window.pdocSearch);
+                script.onerror = (e) => reject(e);
+                script.src = "search.js";
+                document.getElementsByTagName("head")[0].appendChild(script);
+            });
+        } catch (e) {
+            console.error("Cannot fetch pdoc search index");
+            searchErr = "Cannot fetch search index.";
+        }
+        onInput();
+
+        document.querySelector("nav.pdoc").addEventListener("click", e => {
+            if (e.target.hash) {
+                searchBox.value = "";
+                searchBox.dispatchEvent(new Event("input"));
+            }
+        });
+    }
+
+    function onInput() {
+        setContent((() => {
+            const term = getSearchTerm();
+            if (!term) {
+                return null
+            }
+            if (searchErr) {
+                return `<h3>Error: ${searchErr}</h3>`
+            }
+            if (!search) {
+                return "<h3>Searching...</h3>"
+            }
+
+            window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+            const results = search(term);
+
+            let html;
+            if (results.length === 0) {
+                html = `No search results for '${escapeHTML(term)}'.`
+            } else {
+                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+            }
+            for (let result of results.slice(0, 10)) {
+                let doc = result.doc;
+                let url = `${doc.modulename.replaceAll(".", "/")}.html`;
+                if (doc.qualname) {
+                    url += `#${doc.qualname}`;
+                }
+
+                let heading;
+                switch (result.doc.type) {
+                    case "function":
+                        heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+                        break;
+                    case "class":
+                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+                        if (doc.bases)
+                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+                        heading += `:`;
+                        break;
+                    case "variable":
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        if (doc.annotation)
+                            heading += `<span class="annotation">${doc.annotation}</span>`;
+                        if (doc.default_value)
+                            heading += `<span class="default_value">${doc.default_value}</span>`;
+                        break;
+                    default:
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        break;
+                }
+                html += `
+                        <section class="search-result">
+                        <a href="${url}" class="attr ${doc.type}">${heading}</a>
+                        <div class="docstring">${doc.doc}</div>
+                        </section>
+                    `;
+
+            }
+            return html;
+        })());
+    }
+
+    if (getSearchTerm()) {
+        initialize();
+        searchBox.value = getSearchTerm();
+        onInput();
+    } else {
+        searchBox.addEventListener("focus", initialize, {once: true});
+    }
+
+    searchBox.addEventListener("keydown", e => {
+        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+            let focused = currentContent.querySelector(".search-result.focused");
+            if (!focused) {
+                currentContent.querySelector(".search-result").classList.add("focused");
+            } else if (
+                e.key === "ArrowDown"
+                && focused.nextElementSibling
+                && focused.nextElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.nextElementSibling.classList.add("focused");
+                focused.nextElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "ArrowUp"
+                && focused.previousElementSibling
+                && focused.previousElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.previousElementSibling.classList.add("focused");
+                focused.previousElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "Enter"
+            ) {
+                focused.querySelector("a").click();
+            }
+        }
+    });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/exceptions.html b/site2/website/static/api/python/2.10.0/pulsar/exceptions.html
new file mode 100644
index 00000000000..08beb4feb8a
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/exceptions.html
@@ -0,0 +1,260 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar.exceptions API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>            <a class="pdoc-button module-list-button" href="../pulsar.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg>                &nbsp;pulsar</a>
+
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+<a href="./../pulsar.html">pulsar</a><wbr>.exceptions    </h1>
+
+                
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="kn">from</span> <span class="nn">_pulsar</span> <span class="kn">import</span> <span class="n">PulsarException</span><span class="p">,</span> <span class="n">UnknownError</span><span class="p">,</span> <span class="n">InvalidConfiguration</span><span class="p">,</span> <span class="n">Timeout</span><span class="p">,</span> <span class="ne">LookupError</span><span class="p">,</span> <span class="n">ConnectError</span><span class="p">,</span> \
+    <span class="n">ReadError</span><span class="p">,</span> <span class="n">AuthenticationError</span><span class="p">,</span> <span class="n">AuthorizationError</span><span class="p">,</span> <span class="n">ErrorGettingAuthenticationData</span><span class="p">,</span> <span class="n">BrokerMetadataError</span><span class="p">,</span> \
+    <span class="n">BrokerPersistenceError</span><span class="p">,</span> <span class="n">ChecksumError</span><span class="p">,</span> <span class="n">ConsumerBusy</span><span class="p">,</span> <span class="n">NotConnected</span><span class="p">,</span> <span class="n">AlreadyClosed</span><span class="p">,</span> <span class="n">InvalidMessage</span><span class="p">,</span> \
+    <span class="n">ConsumerNotInitialized</span><span class="p">,</span> <span class="n">ProducerNotInitialized</span><span class="p">,</span> <span class="n">ProducerBusy</span><span class="p">,</span> <span class="n">TooManyLookupRequestException</span><span class="p">,</span> <span class="n">InvalidTopicName</span><span class="p">,</span> \
+    <span class="n">InvalidUrl</span><span class="p">,</span> <span class="n">ServiceUnitNotReady</span><span class="p">,</span> <span class="n">OperationNotSupported</span><span class="p">,</span> <span class="n">ProducerBlockedQuotaExceededError</span><span class="p">,</span> \
+    <span class="n">ProducerBlockedQuotaExceededException</span><span class="p">,</span> <span class="n">ProducerQueueIsFull</span><span class="p">,</span> <span class="n">MessageTooBig</span><span class="p">,</span> <span class="n">TopicNotFound</span><span class="p">,</span> <span class="n">SubscriptionNotFound</span><span class="p">,</span> \
+    <span class="n">ConsumerNotFound</span><span class="p">,</span> <span class="n">UnsupportedVersionError</span><span class="p">,</span> <span class="n">TopicTerminated</span><span class="p">,</span> <span class="n">CryptoError</span><span class="p">,</span> <span class="n">IncompatibleSchema</span><span class="p">,</span> <span class="n">ConsumerAssignError</span><span class="p">,</span> \
+    <span class="n">CumulativeAcknowledgementNotAllowedError</span><span class="p">,</span> <span class="n">TransactionCoordinatorNotFoundError</span><span class="p">,</span> <span class="n">InvalidTxnStatusError</span><span class="p">,</span> \
+    <span class="n">NotAllowedError</span><span class="p">,</span> <span class="n">TransactionConflict</span><span class="p">,</span> <span class="n">TransactionNotFound</span><span class="p">,</span> <span class="n">ProducerFenced</span><span class="p">,</span> <span class="n">MemoryBufferIsFull</span>
+</pre></div>
+
+        </details>
+
+            </section>
+    </main>
+<script>
+    function escapeHTML(html) {
+        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+    }
+
+    const originalContent = document.querySelector("main.pdoc");
+    let currentContent = originalContent;
+
+    function setContent(innerHTML) {
+        let elem;
+        if (innerHTML) {
+            elem = document.createElement("main");
+            elem.classList.add("pdoc");
+            elem.innerHTML = innerHTML;
+        } else {
+            elem = originalContent;
+        }
+        if (currentContent !== elem) {
+            currentContent.replaceWith(elem);
+            currentContent = elem;
+        }
+    }
+
+    function getSearchTerm() {
+        return (new URL(window.location)).searchParams.get("search");
+    }
+
+    const searchBox = document.querySelector(".pdoc input[type=search]");
+    searchBox.addEventListener("input", function () {
+        let url = new URL(window.location);
+        if (searchBox.value.trim()) {
+            url.hash = "";
+            url.searchParams.set("search", searchBox.value);
+        } else {
+            url.searchParams.delete("search");
+        }
+        history.replaceState("", "", url.toString());
+        onInput();
+    });
+    window.addEventListener("popstate", onInput);
+
+
+    let search, searchErr;
+
+    async function initialize() {
+        try {
+            search = await new Promise((resolve, reject) => {
+                const script = document.createElement("script");
+                script.type = "text/javascript";
+                script.async = true;
+                script.onload = () => resolve(window.pdocSearch);
+                script.onerror = (e) => reject(e);
+                script.src = "../search.js";
+                document.getElementsByTagName("head")[0].appendChild(script);
+            });
+        } catch (e) {
+            console.error("Cannot fetch pdoc search index");
+            searchErr = "Cannot fetch search index.";
+        }
+        onInput();
+
+        document.querySelector("nav.pdoc").addEventListener("click", e => {
+            if (e.target.hash) {
+                searchBox.value = "";
+                searchBox.dispatchEvent(new Event("input"));
+            }
+        });
+    }
+
+    function onInput() {
+        setContent((() => {
+            const term = getSearchTerm();
+            if (!term) {
+                return null
+            }
+            if (searchErr) {
+                return `<h3>Error: ${searchErr}</h3>`
+            }
+            if (!search) {
+                return "<h3>Searching...</h3>"
+            }
+
+            window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+            const results = search(term);
+
+            let html;
+            if (results.length === 0) {
+                html = `No search results for '${escapeHTML(term)}'.`
+            } else {
+                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+            }
+            for (let result of results.slice(0, 10)) {
+                let doc = result.doc;
+                let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
+                if (doc.qualname) {
+                    url += `#${doc.qualname}`;
+                }
+
+                let heading;
+                switch (result.doc.type) {
+                    case "function":
+                        heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+                        break;
+                    case "class":
+                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+                        if (doc.bases)
+                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+                        heading += `:`;
+                        break;
+                    case "variable":
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        if (doc.annotation)
+                            heading += `<span class="annotation">${doc.annotation}</span>`;
+                        if (doc.default_value)
+                            heading += `<span class="default_value">${doc.default_value}</span>`;
+                        break;
+                    default:
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        break;
+                }
+                html += `
+                        <section class="search-result">
+                        <a href="${url}" class="attr ${doc.type}">${heading}</a>
+                        <div class="docstring">${doc.doc}</div>
+                        </section>
+                    `;
+
+            }
+            return html;
+        })());
+    }
+
+    if (getSearchTerm()) {
+        initialize();
+        searchBox.value = getSearchTerm();
+        onInput();
+    } else {
+        searchBox.addEventListener("focus", initialize, {once: true});
+    }
+
+    searchBox.addEventListener("keydown", e => {
+        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+            let focused = currentContent.querySelector(".search-result.focused");
+            if (!focused) {
+                currentContent.querySelector(".search-result").classList.add("focused");
+            } else if (
+                e.key === "ArrowDown"
+                && focused.nextElementSibling
+                && focused.nextElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.nextElementSibling.classList.add("focused");
+                focused.nextElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "ArrowUp"
+                && focused.previousElementSibling
+                && focused.previousElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.previousElementSibling.classList.add("focused");
+                focused.previousElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "Enter"
+            ) {
+                focused.querySelector("a").click();
+            }
+        }
+    });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions.html b/site2/website/static/api/python/2.10.0/pulsar/functions.html
new file mode 100644
index 00000000000..31443a58706
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions.html
@@ -0,0 +1,259 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar.functions API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>            <a class="pdoc-button module-list-button" href="../pulsar.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg>                &nbsp;pulsar</a>
+
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+
+        <h2>Submodules</h2>
+        <ul>
+                <li><a href="functions/context.html">pulsar.functions.context</a></li>
+                <li><a href="functions/function.html">pulsar.functions.function</a></li>
+                <li><a href="functions/serde.html">pulsar.functions.serde</a></li>
+        </ul>
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+<a href="./../pulsar.html">pulsar</a><wbr>.functions    </h1>
+
+                
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+</pre></div>
+
+        </details>
+
+            </section>
+    </main>
+<script>
+    function escapeHTML(html) {
+        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+    }
+
+    const originalContent = document.querySelector("main.pdoc");
+    let currentContent = originalContent;
+
+    function setContent(innerHTML) {
+        let elem;
+        if (innerHTML) {
+            elem = document.createElement("main");
+            elem.classList.add("pdoc");
+            elem.innerHTML = innerHTML;
+        } else {
+            elem = originalContent;
+        }
+        if (currentContent !== elem) {
+            currentContent.replaceWith(elem);
+            currentContent = elem;
+        }
+    }
+
+    function getSearchTerm() {
+        return (new URL(window.location)).searchParams.get("search");
+    }
+
+    const searchBox = document.querySelector(".pdoc input[type=search]");
+    searchBox.addEventListener("input", function () {
+        let url = new URL(window.location);
+        if (searchBox.value.trim()) {
+            url.hash = "";
+            url.searchParams.set("search", searchBox.value);
+        } else {
+            url.searchParams.delete("search");
+        }
+        history.replaceState("", "", url.toString());
+        onInput();
+    });
+    window.addEventListener("popstate", onInput);
+
+
+    let search, searchErr;
+
+    async function initialize() {
+        try {
+            search = await new Promise((resolve, reject) => {
+                const script = document.createElement("script");
+                script.type = "text/javascript";
+                script.async = true;
+                script.onload = () => resolve(window.pdocSearch);
+                script.onerror = (e) => reject(e);
+                script.src = "../search.js";
+                document.getElementsByTagName("head")[0].appendChild(script);
+            });
+        } catch (e) {
+            console.error("Cannot fetch pdoc search index");
+            searchErr = "Cannot fetch search index.";
+        }
+        onInput();
+
+        document.querySelector("nav.pdoc").addEventListener("click", e => {
+            if (e.target.hash) {
+                searchBox.value = "";
+                searchBox.dispatchEvent(new Event("input"));
+            }
+        });
+    }
+
+    function onInput() {
+        setContent((() => {
+            const term = getSearchTerm();
+            if (!term) {
+                return null
+            }
+            if (searchErr) {
+                return `<h3>Error: ${searchErr}</h3>`
+            }
+            if (!search) {
+                return "<h3>Searching...</h3>"
+            }
+
+            window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+            const results = search(term);
+
+            let html;
+            if (results.length === 0) {
+                html = `No search results for '${escapeHTML(term)}'.`
+            } else {
+                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+            }
+            for (let result of results.slice(0, 10)) {
+                let doc = result.doc;
+                let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
+                if (doc.qualname) {
+                    url += `#${doc.qualname}`;
+                }
+
+                let heading;
+                switch (result.doc.type) {
+                    case "function":
+                        heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+                        break;
+                    case "class":
+                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+                        if (doc.bases)
+                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+                        heading += `:`;
+                        break;
+                    case "variable":
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        if (doc.annotation)
+                            heading += `<span class="annotation">${doc.annotation}</span>`;
+                        if (doc.default_value)
+                            heading += `<span class="default_value">${doc.default_value}</span>`;
+                        break;
+                    default:
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        break;
+                }
+                html += `
+                        <section class="search-result">
+                        <a href="${url}" class="attr ${doc.type}">${heading}</a>
+                        <div class="docstring">${doc.doc}</div>
+                        </section>
+                    `;
+
+            }
+            return html;
+        })());
+    }
+
+    if (getSearchTerm()) {
+        initialize();
+        searchBox.value = getSearchTerm();
+        onInput();
+    } else {
+        searchBox.addEventListener("focus", initialize, {once: true});
+    }
+
+    searchBox.addEventListener("keydown", e => {
+        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+            let focused = currentContent.querySelector(".search-result.focused");
+            if (!focused) {
+                currentContent.querySelector(".search-result").classList.add("focused");
+            } else if (
+                e.key === "ArrowDown"
+                && focused.nextElementSibling
+                && focused.nextElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.nextElementSibling.classList.add("focused");
+                focused.nextElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "ArrowUp"
+                && focused.previousElementSibling
+                && focused.previousElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.previousElementSibling.classList.add("focused");
+                focused.previousElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "Enter"
+            ) {
+                focused.querySelector("a").click();
+            }
+        }
+    });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions/context.html b/site2/website/static/api/python/2.10.0/pulsar/functions/context.html
new file mode 100644
index 00000000000..f7bad2d3b8e
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions/context.html
@@ -0,0 +1,1384 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar.functions.context API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>            <a class="pdoc-button module-list-button" href="../functions.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg>                &nbsp;pulsar.functions</a>
+
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+        <h2>Contents</h2>
+        <ul>
+  <li><a href="#processing-of-a-request">processing of a request.</a></li>
+</ul>
+
+
+
+        <h2>API Documentation</h2>
+            <ul class="memberlist">
+            <li>
+                    <a class="class" href="#Context">Context</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Context.__init__">Context</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_message_id">get_message_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_message_key">get_message_key</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_message_eventtime">get_message_eventtime</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_message_properties">get_message_properties</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_current_message_topic_name">get_current_message_topic_name</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_function_tenant">get_function_tenant</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_function_namespace">get_function_namespace</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_function_name">get_function_name</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_function_id">get_function_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_instance_id">get_instance_id</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_function_version">get_function_version</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_logger">get_logger</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_user_config_value">get_user_config_value</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_user_config_map">get_user_config_map</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_secret">get_secret</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_partition_key">get_partition_key</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.record_metric">record_metric</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.publish">publish</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_input_topics">get_input_topics</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_output_topic">get_output_topic</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_output_serde_class_name">get_output_serde_class_name</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.ack">ack</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.incr_counter">incr_counter</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_counter">get_counter</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.del_counter">del_counter</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.put_state">put_state</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Context.get_state">get_state</a>
+                        </li>
+                </ul>
+
+            </li>
+    </ul>
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../functions.html">functions</a><wbr>.context    </h1>
+
+                        <div class="docstring"><p>context.py: Context defines context information available during</p>
+
+<h1 id="processing-of-a-request">processing of a request.</h1>
+</div>
+
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+<span class="sd">&quot;&quot;&quot;context.py: Context defines context information available during</span>
+<span class="sd"># processing of a request.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+
+<span class="k">class</span> <span class="nc">Context</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Interface defining information available at process time&quot;&quot;&quot;</span>
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the messageid of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the key of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_eventtime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the event time of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the message properties kv map of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_current_message_topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the topic name of the message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+  
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_tenant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the tenant of the message that&#39;s being processed&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_namespace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the namespace of the message that&#39;s being processed&quot;&quot;&quot;</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the function name that we are a part of&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the function id that we are a part of&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_instance_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the instance id that is executing the function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the version of function that we are executing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the logger object that can be used to do logging&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_user_config_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the value of the user-defined config. If the key doesn&#39;t exist, None is returned&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+  
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_user_config_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_secret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secret_name</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the secret value associated with the name. None if nothing was found&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns partition key of the input message is one exists&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">record_metric</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metric_name</span><span class="p">,</span> <span class="n">metric_value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">publish</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">serde_class_name</span><span class="o">=</span><span class="s2">&quot;serde.IdentitySerDe&quot;</span><span class="p">,</span> <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p [...]
+    <span class="sd">&quot;&quot;&quot;Publishes message to topic_name by first serializing the message using serde_class_name serde</span>
+<span class="sd">    The message will have properties specified if any</span>
+
+<span class="sd">    The available options for message_conf:</span>
+
+<span class="sd">      properties,</span>
+<span class="sd">      partition_key,</span>
+<span class="sd">      sequence_id,</span>
+<span class="sd">      replication_clusters,</span>
+<span class="sd">      disable_replication,</span>
+<span class="sd">      event_timestamp</span>
+
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_input_topics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the input topics of function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_output_topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the output topic of function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_output_serde_class_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;return output Serde class&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">ack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgid</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;ack this message id&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">incr_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;incr the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;get the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">del_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;delete the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">put_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;update the value of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;get the value of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            </section>
+                <section id="Context">
+                                <div class="attr class">
+        <a class="headerlink" href="#Context">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Context</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Context</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Interface defining information available at process time&quot;&quot;&quot;</span>
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the messageid of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the key of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_eventtime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the event time of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the message properties kv map of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_current_message_topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the topic name of the message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+  
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_tenant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the tenant of the message that&#39;s being processed&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_namespace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the namespace of the message that&#39;s being processed&quot;&quot;&quot;</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the function name that we are a part of&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the function id that we are a part of&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_instance_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the instance id that is executing the function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the version of function that we are executing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the logger object that can be used to do logging&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_user_config_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the value of the user-defined config. If the key doesn&#39;t exist, None is returned&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+  
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_user_config_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_secret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secret_name</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the secret value associated with the name. None if nothing was found&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns partition key of the input message is one exists&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">record_metric</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metric_name</span><span class="p">,</span> <span class="n">metric_value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">publish</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">serde_class_name</span><span class="o">=</span><span class="s2">&quot;serde.IdentitySerDe&quot;</span><span class="p">,</span> <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p [...]
+    <span class="sd">&quot;&quot;&quot;Publishes message to topic_name by first serializing the message using serde_class_name serde</span>
+<span class="sd">    The message will have properties specified if any</span>
+
+<span class="sd">    The available options for message_conf:</span>
+
+<span class="sd">      properties,</span>
+<span class="sd">      partition_key,</span>
+<span class="sd">      sequence_id,</span>
+<span class="sd">      replication_clusters,</span>
+<span class="sd">      disable_replication,</span>
+<span class="sd">      event_timestamp</span>
+
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_input_topics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the input topics of function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_output_topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the output topic of function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_output_serde_class_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;return output Serde class&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">ack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgid</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;ack this message id&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">incr_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;incr the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;get the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">del_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;delete the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">put_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;update the value of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;get the value of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Interface defining information available at process time</p>
+</div>
+
+
+                            <div id="Context.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Context</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="Context.get_message_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_message_id">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_message_id</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the messageid of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the messageid of the current message that we are processing</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_message_key" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_message_key">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_message_key</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the key of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the key of the current message that we are processing</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_message_eventtime" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_message_eventtime">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_message_eventtime</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_eventtime</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the event time of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the event time of the current message that we are processing</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_message_properties" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_message_properties">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_message_properties</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_message_properties</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Return the message properties kv map of the current message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Return the message properties kv map of the current message that we are processing</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_current_message_topic_name" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_current_message_topic_name">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_current_message_topic_name</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_current_message_topic_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the topic name of the message that we are processing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the topic name of the message that we are processing</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_function_tenant" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_function_tenant">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_function_tenant</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_tenant</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the tenant of the message that&#39;s being processed&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the tenant of the message that's being processed</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_function_namespace" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_function_namespace">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_function_namespace</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_namespace</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the namespace of the message that&#39;s being processed&quot;&quot;&quot;</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the namespace of the message that's being processed</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_function_name" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_function_name">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_function_name</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the function name that we are a part of&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the function name that we are a part of</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_function_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_function_id">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_function_id</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the function id that we are a part of&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the function id that we are a part of</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_instance_id" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_instance_id">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_instance_id</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_instance_id</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the instance id that is executing the function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the instance id that is executing the function</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_function_version" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_function_version">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_function_version</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_function_version</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the version of function that we are executing&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the version of function that we are executing</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_logger" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_logger">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_logger</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_logger</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the logger object that can be used to do logging&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the logger object that can be used to do logging</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_user_config_value" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_user_config_value">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_user_config_value</span><span class="signature">(self, key)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_user_config_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the value of the user-defined config. If the key doesn&#39;t exist, None is returned&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the value of the user-defined config. If the key doesn't exist, None is returned</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_user_config_map" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_user_config_map">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_user_config_map</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_user_config_map</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the entire user-defined config as a dict (the dict will be empty if no user-defined config is supplied)</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_secret" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_secret">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_secret</span><span class="signature">(self, secret_name)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_secret</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">secret_name</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the secret value associated with the name. None if nothing was found&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the secret value associated with the name. None if nothing was found</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_partition_key" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_partition_key">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_partition_key</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_partition_key</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns partition key of the input message is one exists&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns partition key of the input message is one exists</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.record_metric" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.record_metric">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">record_metric</span><span class="signature">(self, metric_name, metric_value)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">record_metric</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">metric_name</span><span class="p">,</span> <span class="n">metric_value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Records the metric_value. metric_value has to satisfy isinstance(metric_value, numbers.Number)</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.publish" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.publish">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">publish</span><span class="signature">(
+    self,
+    topic_name,
+    message,
+    serde_class_name=&#39;serde.IdentitySerDe&#39;,
+    properties=None,
+    compression_type=None,
+    callback=None,
+    message_conf=None
+)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">publish</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">topic_name</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">serde_class_name</span><span class="o">=</span><span class="s2">&quot;serde.IdentitySerDe&quot;</span><span class="p">,</span> <span class="n">properties</span><span class="o">=</span><span class="kc">None</span><span class="p [...]
+    <span class="sd">&quot;&quot;&quot;Publishes message to topic_name by first serializing the message using serde_class_name serde</span>
+<span class="sd">    The message will have properties specified if any</span>
+
+<span class="sd">    The available options for message_conf:</span>
+
+<span class="sd">      properties,</span>
+<span class="sd">      partition_key,</span>
+<span class="sd">      sequence_id,</span>
+<span class="sd">      replication_clusters,</span>
+<span class="sd">      disable_replication,</span>
+<span class="sd">      event_timestamp</span>
+
+<span class="sd">    &quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Publishes message to topic_name by first serializing the message using serde_class_name serde
+The message will have properties specified if any</p>
+
+<p>The available options for message_conf:</p>
+
+<p>properties,
+  partition_key,
+  sequence_id,
+  replication_clusters,
+  disable_replication,
+  event_timestamp</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_input_topics" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_input_topics">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_input_topics</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_input_topics</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the input topics of function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the input topics of function</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_output_topic" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_output_topic">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_output_topic</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_output_topic</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Returns the output topic of function&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Returns the output topic of function</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_output_serde_class_name" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_output_serde_class_name">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_output_serde_class_name</span><span class="signature">(self)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_output_serde_class_name</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;return output Serde class&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>return output Serde class</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.ack" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.ack">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">ack</span><span class="signature">(self, msgid, topic)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">ack</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msgid</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;ack this message id&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>ack this message id</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.incr_counter" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.incr_counter">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">incr_counter</span><span class="signature">(self, key, amount)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">incr_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;incr the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>incr the counter of a given key in the managed state</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_counter" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_counter">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_counter</span><span class="signature">(self, key)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;get the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>get the counter of a given key in the managed state</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.del_counter" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.del_counter">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">del_counter</span><span class="signature">(self, key)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">del_counter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;delete the counter of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>delete the counter of a given key in the managed state</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.put_state" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.put_state">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">put_state</span><span class="signature">(self, key, value)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">put_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;update the value of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>update the value of a given key in the managed state</p>
+</div>
+
+
+                            </div>
+                            <div id="Context.get_state" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Context.get_state">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">get_state</span><span class="signature">(self, key)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">get_state</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;get the value of a given key in the managed state&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>get the value of a given key in the managed state</p>
+</div>
+
+
+                            </div>
+                </section>
+    </main>
+<script>
+    function escapeHTML(html) {
+        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+    }
+
+    const originalContent = document.querySelector("main.pdoc");
+    let currentContent = originalContent;
+
+    function setContent(innerHTML) {
+        let elem;
+        if (innerHTML) {
+            elem = document.createElement("main");
+            elem.classList.add("pdoc");
+            elem.innerHTML = innerHTML;
+        } else {
+            elem = originalContent;
+        }
+        if (currentContent !== elem) {
+            currentContent.replaceWith(elem);
+            currentContent = elem;
+        }
+    }
+
+    function getSearchTerm() {
+        return (new URL(window.location)).searchParams.get("search");
+    }
+
+    const searchBox = document.querySelector(".pdoc input[type=search]");
+    searchBox.addEventListener("input", function () {
+        let url = new URL(window.location);
+        if (searchBox.value.trim()) {
+            url.hash = "";
+            url.searchParams.set("search", searchBox.value);
+        } else {
+            url.searchParams.delete("search");
+        }
+        history.replaceState("", "", url.toString());
+        onInput();
+    });
+    window.addEventListener("popstate", onInput);
+
+
+    let search, searchErr;
+
+    async function initialize() {
+        try {
+            search = await new Promise((resolve, reject) => {
+                const script = document.createElement("script");
+                script.type = "text/javascript";
+                script.async = true;
+                script.onload = () => resolve(window.pdocSearch);
+                script.onerror = (e) => reject(e);
+                script.src = "../../search.js";
+                document.getElementsByTagName("head")[0].appendChild(script);
+            });
+        } catch (e) {
+            console.error("Cannot fetch pdoc search index");
+            searchErr = "Cannot fetch search index.";
+        }
+        onInput();
+
+        document.querySelector("nav.pdoc").addEventListener("click", e => {
+            if (e.target.hash) {
+                searchBox.value = "";
+                searchBox.dispatchEvent(new Event("input"));
+            }
+        });
+    }
+
+    function onInput() {
+        setContent((() => {
+            const term = getSearchTerm();
+            if (!term) {
+                return null
+            }
+            if (searchErr) {
+                return `<h3>Error: ${searchErr}</h3>`
+            }
+            if (!search) {
+                return "<h3>Searching...</h3>"
+            }
+
+            window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+            const results = search(term);
+
+            let html;
+            if (results.length === 0) {
+                html = `No search results for '${escapeHTML(term)}'.`
+            } else {
+                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+            }
+            for (let result of results.slice(0, 10)) {
+                let doc = result.doc;
+                let url = `../../${doc.modulename.replaceAll(".", "/")}.html`;
+                if (doc.qualname) {
+                    url += `#${doc.qualname}`;
+                }
+
+                let heading;
+                switch (result.doc.type) {
+                    case "function":
+                        heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+                        break;
+                    case "class":
+                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+                        if (doc.bases)
+                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+                        heading += `:`;
+                        break;
+                    case "variable":
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        if (doc.annotation)
+                            heading += `<span class="annotation">${doc.annotation}</span>`;
+                        if (doc.default_value)
+                            heading += `<span class="default_value">${doc.default_value}</span>`;
+                        break;
+                    default:
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        break;
+                }
+                html += `
+                        <section class="search-result">
+                        <a href="${url}" class="attr ${doc.type}">${heading}</a>
+                        <div class="docstring">${doc.doc}</div>
+                        </section>
+                    `;
+
+            }
+            return html;
+        })());
+    }
+
+    if (getSearchTerm()) {
+        initialize();
+        searchBox.value = getSearchTerm();
+        onInput();
+    } else {
+        searchBox.addEventListener("focus", initialize, {once: true});
+    }
+
+    searchBox.addEventListener("keydown", e => {
+        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+            let focused = currentContent.querySelector(".search-result.focused");
+            if (!focused) {
+                currentContent.querySelector(".search-result").classList.add("focused");
+            } else if (
+                e.key === "ArrowDown"
+                && focused.nextElementSibling
+                && focused.nextElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.nextElementSibling.classList.add("focused");
+                focused.nextElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "ArrowUp"
+                && focused.previousElementSibling
+                && focused.previousElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.previousElementSibling.classList.add("focused");
+                focused.previousElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "Enter"
+            ) {
+                focused.querySelector("a").click();
+            }
+        }
+    });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions/function.html b/site2/website/static/api/python/2.10.0/pulsar/functions/function.html
new file mode 100644
index 00000000000..8d0f8aae48e
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions/function.html
@@ -0,0 +1,376 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar.functions.function API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>            <a class="pdoc-button module-list-button" href="../functions.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg>                &nbsp;pulsar.functions</a>
+
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+        <h2>Contents</h2>
+        <ul>
+  <li><a href="#the-process-method-is-called-for-every-message-of-the-input-topic-of-the">The process method is called for every message of the input topic of the</a></li>
+  <li><a href="#function-the-incoming-input-bytes-are-deserialized-using-the-serde">function. The incoming input bytes are deserialized using the serde.</a></li>
+  <li><a href="#the-process-function-can-optionally-emit-an-output">The process function can optionally emit an output</a></li>
+</ul>
+
+
+
+        <h2>API Documentation</h2>
+            <ul class="memberlist">
+            <li>
+                    <a class="class" href="#Function">Function</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Function.__init__">Function</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Function.process">process</a>
+                        </li>
+                </ul>
+
+            </li>
+    </ul>
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../functions.html">functions</a><wbr>.function    </h1>
+
+                        <div class="docstring"><p>function.py: This is the core interface of the function api.</p>
+
+<h1 id="the-process-method-is-called-for-every-message-of-the-input-topic-of-the">The process method is called for every message of the input topic of the</h1>
+
+<h1 id="function-the-incoming-input-bytes-are-deserialized-using-the-serde">function. The incoming input bytes are deserialized using the serde.</h1>
+
+<h1 id="the-process-function-can-optionally-emit-an-output">The process function can optionally emit an output</h1>
+</div>
+
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+<span class="sd">&quot;&quot;&quot;function.py: This is the core interface of the function api.</span>
+<span class="sd"># The process method is called for every message of the input topic of the</span>
+<span class="sd"># function. The incoming input bytes are deserialized using the serde.</span>
+<span class="sd"># The process function can optionally emit an output</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+
+<span class="k">class</span> <span class="nc">Function</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Interface for Pulsar Function&quot;&quot;&quot;</span>
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Process input message&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            </section>
+                <section id="Function">
+                                <div class="attr class">
+        <a class="headerlink" href="#Function">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">Function</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">Function</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Interface for Pulsar Function&quot;&quot;&quot;</span>
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Process input message&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Interface for Pulsar Function</p>
+</div>
+
+
+                            <div id="Function.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Function.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">Function</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="Function.process" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#Function.process">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">process</span><span class="signature">(self, input, context)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">process</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">,</span> <span class="n">context</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Process input message&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Process input message</p>
+</div>
+
+
+                            </div>
+                </section>
+    </main>
+<script>
+    function escapeHTML(html) {
+        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+    }
+
+    const originalContent = document.querySelector("main.pdoc");
+    let currentContent = originalContent;
+
+    function setContent(innerHTML) {
+        let elem;
+        if (innerHTML) {
+            elem = document.createElement("main");
+            elem.classList.add("pdoc");
+            elem.innerHTML = innerHTML;
+        } else {
+            elem = originalContent;
+        }
+        if (currentContent !== elem) {
+            currentContent.replaceWith(elem);
+            currentContent = elem;
+        }
+    }
+
+    function getSearchTerm() {
+        return (new URL(window.location)).searchParams.get("search");
+    }
+
+    const searchBox = document.querySelector(".pdoc input[type=search]");
+    searchBox.addEventListener("input", function () {
+        let url = new URL(window.location);
+        if (searchBox.value.trim()) {
+            url.hash = "";
+            url.searchParams.set("search", searchBox.value);
+        } else {
+            url.searchParams.delete("search");
+        }
+        history.replaceState("", "", url.toString());
+        onInput();
+    });
+    window.addEventListener("popstate", onInput);
+
+
+    let search, searchErr;
+
+    async function initialize() {
+        try {
+            search = await new Promise((resolve, reject) => {
+                const script = document.createElement("script");
+                script.type = "text/javascript";
+                script.async = true;
+                script.onload = () => resolve(window.pdocSearch);
+                script.onerror = (e) => reject(e);
+                script.src = "../../search.js";
+                document.getElementsByTagName("head")[0].appendChild(script);
+            });
+        } catch (e) {
+            console.error("Cannot fetch pdoc search index");
+            searchErr = "Cannot fetch search index.";
+        }
+        onInput();
+
+        document.querySelector("nav.pdoc").addEventListener("click", e => {
+            if (e.target.hash) {
+                searchBox.value = "";
+                searchBox.dispatchEvent(new Event("input"));
+            }
+        });
+    }
+
+    function onInput() {
+        setContent((() => {
+            const term = getSearchTerm();
+            if (!term) {
+                return null
+            }
+            if (searchErr) {
+                return `<h3>Error: ${searchErr}</h3>`
+            }
+            if (!search) {
+                return "<h3>Searching...</h3>"
+            }
+
+            window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+            const results = search(term);
+
+            let html;
+            if (results.length === 0) {
+                html = `No search results for '${escapeHTML(term)}'.`
+            } else {
+                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+            }
+            for (let result of results.slice(0, 10)) {
+                let doc = result.doc;
+                let url = `../../${doc.modulename.replaceAll(".", "/")}.html`;
+                if (doc.qualname) {
+                    url += `#${doc.qualname}`;
+                }
+
+                let heading;
+                switch (result.doc.type) {
+                    case "function":
+                        heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+                        break;
+                    case "class":
+                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+                        if (doc.bases)
+                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+                        heading += `:`;
+                        break;
+                    case "variable":
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        if (doc.annotation)
+                            heading += `<span class="annotation">${doc.annotation}</span>`;
+                        if (doc.default_value)
+                            heading += `<span class="default_value">${doc.default_value}</span>`;
+                        break;
+                    default:
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        break;
+                }
+                html += `
+                        <section class="search-result">
+                        <a href="${url}" class="attr ${doc.type}">${heading}</a>
+                        <div class="docstring">${doc.doc}</div>
+                        </section>
+                    `;
+
+            }
+            return html;
+        })());
+    }
+
+    if (getSearchTerm()) {
+        initialize();
+        searchBox.value = getSearchTerm();
+        onInput();
+    } else {
+        searchBox.addEventListener("focus", initialize, {once: true});
+    }
+
+    searchBox.addEventListener("keydown", e => {
+        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+            let focused = currentContent.querySelector(".search-result.focused");
+            if (!focused) {
+                currentContent.querySelector(".search-result").classList.add("focused");
+            } else if (
+                e.key === "ArrowDown"
+                && focused.nextElementSibling
+                && focused.nextElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.nextElementSibling.classList.add("focused");
+                focused.nextElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "ArrowUp"
+                && focused.previousElementSibling
+                && focused.previousElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.previousElementSibling.classList.add("focused");
+                focused.previousElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "Enter"
+            ) {
+                focused.querySelector("a").click();
+            }
+        }
+    });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/functions/serde.html b/site2/website/static/api/python/2.10.0/pulsar/functions/serde.html
new file mode 100644
index 00000000000..e27884001c3
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/functions/serde.html
@@ -0,0 +1,665 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar.functions.serde API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>            <a class="pdoc-button module-list-button" href="../functions.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg>                &nbsp;pulsar.functions</a>
+
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+        <h2>Contents</h2>
+        <ul>
+  <li><a href="#everytime-a-message-is-read-from-pulsar-topic-the-serde-is-invoked-to">Everytime a message is read from pulsar topic, the serde is invoked to</a></li>
+  <li><a href="#serialize-the-bytes-into-an-object-before-invoking-the-process-method">serialize the bytes into an object before invoking the process method.</a></li>
+  <li><a href="#anytime-a-python-object-needs-to-be-written-back-to-pulsar-it-is">Anytime a python object needs to be written back to pulsar, it is</a></li>
+  <li><a href="#serialized-into-bytes-before-writing">serialized into bytes before writing.</a></li>
+</ul>
+
+
+
+        <h2>API Documentation</h2>
+            <ul class="memberlist">
+            <li>
+                    <a class="class" href="#SerDe">SerDe</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#SerDe.__init__">SerDe</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#SerDe.serialize">serialize</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#SerDe.deserialize">deserialize</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#PickleSerDe">PickleSerDe</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#PickleSerDe.__init__">PickleSerDe</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#PickleSerDe.serialize">serialize</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#PickleSerDe.deserialize">deserialize</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#IdentitySerDe">IdentitySerDe</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#IdentitySerDe.__init__">IdentitySerDe</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#IdentitySerDe.serialize">serialize</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#IdentitySerDe.deserialize">deserialize</a>
+                        </li>
+                </ul>
+
+            </li>
+    </ul>
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../functions.html">functions</a><wbr>.serde    </h1>
+
+                        <div class="docstring"><p>serde.py: SerDe defines the interface for serialization/deserialization.</p>
+
+<h1 id="everytime-a-message-is-read-from-pulsar-topic-the-serde-is-invoked-to">Everytime a message is read from pulsar topic, the serde is invoked to</h1>
+
+<h1 id="serialize-the-bytes-into-an-object-before-invoking-the-process-method">serialize the bytes into an object before invoking the process method.</h1>
+
+<h1 id="anytime-a-python-object-needs-to-be-written-back-to-pulsar-it-is">Anytime a python object needs to be written back to pulsar, it is</h1>
+
+<h1 id="serialized-into-bytes-before-writing">serialized into bytes before writing.</h1>
+</div>
+
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="ch">#!/usr/bin/env python</span>
+<span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="c1"># -*- encoding: utf-8 -*-</span>
+
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+<span class="sd">&quot;&quot;&quot;serde.py: SerDe defines the interface for serialization/deserialization.</span>
+<span class="sd"># Everytime a message is read from pulsar topic, the serde is invoked to</span>
+<span class="sd"># serialize the bytes into an object before invoking the process method.</span>
+<span class="sd"># Anytime a python object needs to be written back to pulsar, it is</span>
+<span class="sd"># serialized into bytes before writing.</span>
+<span class="sd">&quot;&quot;&quot;</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+
+<span class="kn">import</span> <span class="nn">pickle</span>
+
+<span class="k">class</span> <span class="nc">SerDe</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Interface for Serialization/Deserialization&quot;&quot;&quot;</span>
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Serialize input message into bytes&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Serialize input_bytes into an object&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+<span class="k">class</span> <span class="nc">PickleSerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Pickle based serializer&quot;&quot;&quot;</span>
+  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+      <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+      <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">input_bytes</span><span class="p">)</span>
+
+<span class="k">class</span> <span class="nc">IdentitySerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Simple Serde that just conversion to string and back&quot;&quot;&quot;</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">_types</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+    <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+      <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+    <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="o">==</span> <span class="nb">bytes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="nb">input</span>
+    <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;IdentitySerde cannot serialize object of type </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+    <span class="k">for</span> <span class="n">typ</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+      <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">typ</span><span class="p">(</span><span class="n">input_bytes</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
+      <span class="k">except</span><span class="p">:</span>
+        <span class="k">pass</span>
+    <span class="k">return</span> <span class="n">input_bytes</span>
+</pre></div>
+
+        </details>
+
+            </section>
+                <section id="SerDe">
+                                <div class="attr class">
+        <a class="headerlink" href="#SerDe">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">SerDe</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">SerDe</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Interface for Serialization/Deserialization&quot;&quot;&quot;</span>
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Serialize input message into bytes&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+
+  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Serialize input_bytes into an object&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Interface for Serialization/Deserialization</p>
+</div>
+
+
+                            <div id="SerDe.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#SerDe.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">SerDe</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="SerDe.serialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#SerDe.serialize">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">serialize</span><span class="signature">(self, input)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Serialize input message into bytes&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Serialize input message into bytes</p>
+</div>
+
+
+                            </div>
+                            <div id="SerDe.deserialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#SerDe.deserialize">#&nbsp;&nbsp</a>
+
+                <div class="decorator">@abstractmethod</div>
+
+            <span class="def">def</span>
+            <span class="name">deserialize</span><span class="signature">(self, input_bytes)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="nd">@abstractmethod</span>
+  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+    <span class="sd">&quot;&quot;&quot;Serialize input_bytes into an object&quot;&quot;&quot;</span>
+    <span class="k">pass</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Serialize input_bytes into an object</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="PickleSerDe">
+                                <div class="attr class">
+        <a class="headerlink" href="#PickleSerDe">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">PickleSerDe</span><wbr>(<span class="base"><a href="#SerDe">SerDe</a></span>):
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">PickleSerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Pickle based serializer&quot;&quot;&quot;</span>
+  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+      <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
+
+  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+      <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">input_bytes</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Pickle based serializer</p>
+</div>
+
+
+                            <div id="PickleSerDe.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#PickleSerDe.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">PickleSerDe</span><span class="signature">()</span>
+    </div>
+
+    
+    
+
+                            </div>
+                            <div id="PickleSerDe.serialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#PickleSerDe.serialize">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">serialize</span><span class="signature">(self, input)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+      <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Serialize input message into bytes</p>
+</div>
+
+
+                            </div>
+                            <div id="PickleSerDe.deserialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#PickleSerDe.deserialize">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">deserialize</span><span class="signature">(self, input_bytes)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+      <span class="k">return</span> <span class="n">pickle</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">input_bytes</span><span class="p">)</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Serialize input_bytes into an object</p>
+</div>
+
+
+                            </div>
+                </section>
+                <section id="IdentitySerDe">
+                                <div class="attr class">
+        <a class="headerlink" href="#IdentitySerDe">#&nbsp;&nbsp</a>
+
+        
+        <span class="def">class</span>
+        <span class="name">IdentitySerDe</span><wbr>(<span class="base"><a href="#SerDe">SerDe</a></span>):
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="k">class</span> <span class="nc">IdentitySerDe</span><span class="p">(</span><span class="n">SerDe</span><span class="p">):</span>
+  <span class="sd">&quot;&quot;&quot;Simple Serde that just conversion to string and back&quot;&quot;&quot;</span>
+  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">_types</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
+
+  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+    <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+      <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+    <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="o">==</span> <span class="nb">bytes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="nb">input</span>
+    <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;IdentitySerde cannot serialize object of type </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">))</span>
+
+  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+    <span class="k">for</span> <span class="n">typ</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+      <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">typ</span><span class="p">(</span><span class="n">input_bytes</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
+      <span class="k">except</span><span class="p">:</span>
+        <span class="k">pass</span>
+    <span class="k">return</span> <span class="n">input_bytes</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Simple Serde that just conversion to string and back</p>
+</div>
+
+
+                            <div id="IdentitySerDe.__init__" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#IdentitySerDe.__init__">#&nbsp;&nbsp</a>
+
+        
+            <span class="name">IdentitySerDe</span><span class="signature">()</span>
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
+    <span class="bp">self</span><span class="o">.</span><span class="n">_types</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">float</span><span class="p">,</span> <span class="nb">complex</span><span class="p">,</span> <span class="nb">str</span><span class="p">]</span>
+</pre></div>
+
+        </details>
+
+    
+
+                            </div>
+                            <div id="IdentitySerDe.serialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#IdentitySerDe.serialize">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">serialize</span><span class="signature">(self, input)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="k">def</span> <span class="nf">serialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="nb">input</span><span class="p">):</span>
+    <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+      <span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">)</span>
+    <span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">)</span> <span class="o">==</span> <span class="nb">bytes</span><span class="p">:</span>
+      <span class="k">return</span> <span class="nb">input</span>
+    <span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s2">&quot;IdentitySerde cannot serialize object of type </span><span class="si">%s</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">type</span><span class="p">(</span><span class="nb">input</span><span class="p">))</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Serialize input message into bytes</p>
+</div>
+
+
+                            </div>
+                            <div id="IdentitySerDe.deserialize" class="classattr">
+                                        <div class="attr function"><a class="headerlink" href="#IdentitySerDe.deserialize">#&nbsp;&nbsp</a>
+
+        
+            <span class="def">def</span>
+            <span class="name">deserialize</span><span class="signature">(self, input_bytes)</span>:
+    </div>
+
+            <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span>  <span class="k">def</span> <span class="nf">deserialize</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">input_bytes</span><span class="p">):</span>
+    <span class="k">for</span> <span class="n">typ</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_types</span><span class="p">:</span>
+      <span class="k">try</span><span class="p">:</span>
+        <span class="k">return</span> <span class="n">typ</span><span class="p">(</span><span class="n">input_bytes</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</span><span class="p">))</span>
+      <span class="k">except</span><span class="p">:</span>
+        <span class="k">pass</span>
+    <span class="k">return</span> <span class="n">input_bytes</span>
+</pre></div>
+
+        </details>
+
+            <div class="docstring"><p>Serialize input_bytes into an object</p>
+</div>
+
+
+                            </div>
+                </section>
+    </main>
+<script>
+    function escapeHTML(html) {
+        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+    }
+
+    const originalContent = document.querySelector("main.pdoc");
+    let currentContent = originalContent;
+
+    function setContent(innerHTML) {
+        let elem;
+        if (innerHTML) {
+            elem = document.createElement("main");
+            elem.classList.add("pdoc");
+            elem.innerHTML = innerHTML;
+        } else {
+            elem = originalContent;
+        }
+        if (currentContent !== elem) {
+            currentContent.replaceWith(elem);
+            currentContent = elem;
+        }
+    }
+
+    function getSearchTerm() {
+        return (new URL(window.location)).searchParams.get("search");
+    }
+
+    const searchBox = document.querySelector(".pdoc input[type=search]");
+    searchBox.addEventListener("input", function () {
+        let url = new URL(window.location);
+        if (searchBox.value.trim()) {
+            url.hash = "";
+            url.searchParams.set("search", searchBox.value);
+        } else {
+            url.searchParams.delete("search");
+        }
+        history.replaceState("", "", url.toString());
+        onInput();
+    });
+    window.addEventListener("popstate", onInput);
+
+
+    let search, searchErr;
+
+    async function initialize() {
+        try {
+            search = await new Promise((resolve, reject) => {
+                const script = document.createElement("script");
+                script.type = "text/javascript";
+                script.async = true;
+                script.onload = () => resolve(window.pdocSearch);
+                script.onerror = (e) => reject(e);
+                script.src = "../../search.js";
+                document.getElementsByTagName("head")[0].appendChild(script);
+            });
+        } catch (e) {
+            console.error("Cannot fetch pdoc search index");
+            searchErr = "Cannot fetch search index.";
+        }
+        onInput();
+
+        document.querySelector("nav.pdoc").addEventListener("click", e => {
+            if (e.target.hash) {
+                searchBox.value = "";
+                searchBox.dispatchEvent(new Event("input"));
+            }
+        });
+    }
+
+    function onInput() {
+        setContent((() => {
+            const term = getSearchTerm();
+            if (!term) {
+                return null
+            }
+            if (searchErr) {
+                return `<h3>Error: ${searchErr}</h3>`
+            }
+            if (!search) {
+                return "<h3>Searching...</h3>"
+            }
+
+            window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+            const results = search(term);
+
+            let html;
+            if (results.length === 0) {
+                html = `No search results for '${escapeHTML(term)}'.`
+            } else {
+                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+            }
+            for (let result of results.slice(0, 10)) {
+                let doc = result.doc;
+                let url = `../../${doc.modulename.replaceAll(".", "/")}.html`;
+                if (doc.qualname) {
+                    url += `#${doc.qualname}`;
+                }
+
+                let heading;
+                switch (result.doc.type) {
+                    case "function":
+                        heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+                        break;
+                    case "class":
+                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+                        if (doc.bases)
+                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+                        heading += `:`;
+                        break;
+                    case "variable":
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        if (doc.annotation)
+                            heading += `<span class="annotation">${doc.annotation}</span>`;
+                        if (doc.default_value)
+                            heading += `<span class="default_value">${doc.default_value}</span>`;
+                        break;
+                    default:
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        break;
+                }
+                html += `
+                        <section class="search-result">
+                        <a href="${url}" class="attr ${doc.type}">${heading}</a>
+                        <div class="docstring">${doc.doc}</div>
+                        </section>
+                    `;
+
+            }
+            return html;
+        })());
+    }
+
+    if (getSearchTerm()) {
+        initialize();
+        searchBox.value = getSearchTerm();
+        onInput();
+    } else {
+        searchBox.addEventListener("focus", initialize, {once: true});
+    }
+
+    searchBox.addEventListener("keydown", e => {
+        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+            let focused = currentContent.querySelector(".search-result.focused");
+            if (!focused) {
+                currentContent.querySelector(".search-result").classList.add("focused");
+            } else if (
+                e.key === "ArrowDown"
+                && focused.nextElementSibling
+                && focused.nextElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.nextElementSibling.classList.add("focused");
+                focused.nextElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "ArrowUp"
+                && focused.previousElementSibling
+                && focused.previousElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.previousElementSibling.classList.add("focused");
+                focused.previousElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "Enter"
+            ) {
+                focused.querySelector("a").click();
+            }
+        }
+    });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/schema.html b/site2/website/static/api/python/2.10.0/pulsar/schema.html
new file mode 100644
index 00000000000..3b52c59587f
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/schema.html
@@ -0,0 +1,262 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar.schema API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>            <a class="pdoc-button module-list-button" href="../pulsar.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg>                &nbsp;pulsar</a>
+
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+
+        <h2>Submodules</h2>
+        <ul>
+                <li><a href="schema/definition.html">pulsar.schema.definition</a></li>
+                <li><a href="schema/schema.html">pulsar.schema.schema</a></li>
+                <li><a href="schema/schema_avro.html">pulsar.schema.schema_avro</a></li>
+        </ul>
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+<a href="./../pulsar.html">pulsar</a><wbr>.schema    </h1>
+
+                
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="kn">from</span> <span class="nn">.definition</span> <span class="kn">import</span> <span class="n">Record</span><span class="p">,</span> <span class="n">Field</span><span class="p">,</span> <span class="n">Null</span><span class="p">,</span> <span class="n">Boolean</span><span class="p">,</span> <span class="n">Integer</span><span class="p">,</span> <span class="n">Long</span><span class="p">,</span> \
+            <span class="n">Float</span><span class="p">,</span> <span class="n">Double</span><span class="p">,</span> <span class="n">Bytes</span><span class="p">,</span> <span class="n">String</span><span class="p">,</span> <span class="n">Array</span><span class="p">,</span> <span class="n">Map</span><span class="p">,</span> <span class="n">CustomEnum</span>
+
+<span class="kn">from</span> <span class="nn">.schema</span> <span class="kn">import</span> <span class="n">Schema</span><span class="p">,</span> <span class="n">BytesSchema</span><span class="p">,</span> <span class="n">StringSchema</span><span class="p">,</span> <span class="n">JsonSchema</span>
+<span class="kn">from</span> <span class="nn">.schema_avro</span> <span class="kn">import</span> <span class="n">AvroSchema</span>
+</pre></div>
+
+        </details>
+
+            </section>
+    </main>
+<script>
+    function escapeHTML(html) {
+        return document.createElement('div').appendChild(document.createTextNode(html)).parentNode.innerHTML;
+    }
+
+    const originalContent = document.querySelector("main.pdoc");
+    let currentContent = originalContent;
+
+    function setContent(innerHTML) {
+        let elem;
+        if (innerHTML) {
+            elem = document.createElement("main");
+            elem.classList.add("pdoc");
+            elem.innerHTML = innerHTML;
+        } else {
+            elem = originalContent;
+        }
+        if (currentContent !== elem) {
+            currentContent.replaceWith(elem);
+            currentContent = elem;
+        }
+    }
+
+    function getSearchTerm() {
+        return (new URL(window.location)).searchParams.get("search");
+    }
+
+    const searchBox = document.querySelector(".pdoc input[type=search]");
+    searchBox.addEventListener("input", function () {
+        let url = new URL(window.location);
+        if (searchBox.value.trim()) {
+            url.hash = "";
+            url.searchParams.set("search", searchBox.value);
+        } else {
+            url.searchParams.delete("search");
+        }
+        history.replaceState("", "", url.toString());
+        onInput();
+    });
+    window.addEventListener("popstate", onInput);
+
+
+    let search, searchErr;
+
+    async function initialize() {
+        try {
+            search = await new Promise((resolve, reject) => {
+                const script = document.createElement("script");
+                script.type = "text/javascript";
+                script.async = true;
+                script.onload = () => resolve(window.pdocSearch);
+                script.onerror = (e) => reject(e);
+                script.src = "../search.js";
+                document.getElementsByTagName("head")[0].appendChild(script);
+            });
+        } catch (e) {
+            console.error("Cannot fetch pdoc search index");
+            searchErr = "Cannot fetch search index.";
+        }
+        onInput();
+
+        document.querySelector("nav.pdoc").addEventListener("click", e => {
+            if (e.target.hash) {
+                searchBox.value = "";
+                searchBox.dispatchEvent(new Event("input"));
+            }
+        });
+    }
+
+    function onInput() {
+        setContent((() => {
+            const term = getSearchTerm();
+            if (!term) {
+                return null
+            }
+            if (searchErr) {
+                return `<h3>Error: ${searchErr}</h3>`
+            }
+            if (!search) {
+                return "<h3>Searching...</h3>"
+            }
+
+            window.scrollTo({top: 0, left: 0, behavior: 'auto'});
+
+            const results = search(term);
+
+            let html;
+            if (results.length === 0) {
+                html = `No search results for '${escapeHTML(term)}'.`
+            } else {
+                html = `<h4>${results.length} search result${results.length > 1 ? "s" : ""} for '${escapeHTML(term)}'.</h4>`;
+            }
+            for (let result of results.slice(0, 10)) {
+                let doc = result.doc;
+                let url = `../${doc.modulename.replaceAll(".", "/")}.html`;
+                if (doc.qualname) {
+                    url += `#${doc.qualname}`;
+                }
+
+                let heading;
+                switch (result.doc.type) {
+                    case "function":
+                        heading = `<span class="def">${doc.funcdef}</span> <span class="name">${doc.fullname}</span><span class="signature">${doc.signature}:</span>`;
+                        break;
+                    case "class":
+                        heading = `<span class="def">class</span> <span class="name">${doc.fullname}</span>`;
+                        if (doc.bases)
+                            heading += `<wbr>(<span class="base">${doc.bases}</span>)`;
+                        heading += `:`;
+                        break;
+                    case "variable":
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        if (doc.annotation)
+                            heading += `<span class="annotation">${doc.annotation}</span>`;
+                        if (doc.default_value)
+                            heading += `<span class="default_value">${doc.default_value}</span>`;
+                        break;
+                    default:
+                        heading = `<span class="name">${doc.fullname}</span>`;
+                        break;
+                }
+                html += `
+                        <section class="search-result">
+                        <a href="${url}" class="attr ${doc.type}">${heading}</a>
+                        <div class="docstring">${doc.doc}</div>
+                        </section>
+                    `;
+
+            }
+            return html;
+        })());
+    }
+
+    if (getSearchTerm()) {
+        initialize();
+        searchBox.value = getSearchTerm();
+        onInput();
+    } else {
+        searchBox.addEventListener("focus", initialize, {once: true});
+    }
+
+    searchBox.addEventListener("keydown", e => {
+        if (["ArrowDown", "ArrowUp", "Enter"].includes(e.key)) {
+            let focused = currentContent.querySelector(".search-result.focused");
+            if (!focused) {
+                currentContent.querySelector(".search-result").classList.add("focused");
+            } else if (
+                e.key === "ArrowDown"
+                && focused.nextElementSibling
+                && focused.nextElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.nextElementSibling.classList.add("focused");
+                focused.nextElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "ArrowUp"
+                && focused.previousElementSibling
+                && focused.previousElementSibling.classList.contains("search-result")
+            ) {
+                focused.classList.remove("focused");
+                focused.previousElementSibling.classList.add("focused");
+                focused.previousElementSibling.scrollIntoView({
+                    behavior: "smooth",
+                    block: "nearest",
+                    inline: "nearest"
+                });
+            } else if (
+                e.key === "Enter"
+            ) {
+                focused.querySelector("a").click();
+            }
+        }
+    });
+</script></body>
+</html>
\ No newline at end of file
diff --git a/site2/website/static/api/python/2.10.0/pulsar/schema/definition.html b/site2/website/static/api/python/2.10.0/pulsar/schema/definition.html
new file mode 100644
index 00000000000..33b2b168539
--- /dev/null
+++ b/site2/website/static/api/python/2.10.0/pulsar/schema/definition.html
@@ -0,0 +1,3274 @@
+<!doctype html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="generator" content="pdoc 11.0.0"/>
+    <title>pulsar.schema.definition API documentation</title>
+
+    <style>/*! * Bootstrap Reboot v5.0.0 (https://getbootstrap.com/) * Copyright 2011-2021 The Bootstrap Authors * Copyright 2011-2021 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md) */*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-appl [...]
+    <style>/*! syntax-highlighting.css */pre{line-height:125%;}span.linenos{color:inherit; background-color:transparent; padding-left:5px; padding-right:20px;}.pdoc-code .hll{background-color:#ffffcc}.pdoc-code{background:#f8f8f8;}.pdoc-code .c{color:#3D7B7B; font-style:italic}.pdoc-code .err{border:1px solid #FF0000}.pdoc-code .k{color:#008000; font-weight:bold}.pdoc-code .o{color:#666666}.pdoc-code .ch{color:#3D7B7B; font-style:italic}.pdoc-code .cm{color:#3D7B7B; font-style:italic}.pd [...]
+    <style>/*! theme.css */:root{--pdoc-background:#fff;}.pdoc{--text:#212529;--muted:#6c757d;--link:#3660a5;--link-hover:#1659c5;--code:#f8f8f8;--active:#fff598;--accent:#eee;--accent2:#c1c1c1;--nav-hover:rgba(255, 255, 255, 0.5);--name:#0066BB;--def:#008800;--annotation:#007020;}</style>
+    <style>/*! layout.css */html, body{width:100%;height:100%;}html, main{scroll-behavior:smooth;}body{background-color:var(--pdoc-background);}@media (max-width:769px){#navtoggle{cursor:pointer;position:absolute;width:50px;height:40px;top:1rem;right:1rem;border-color:var(--text);color:var(--text);display:flex;opacity:0.8;}#navtoggle:hover{opacity:1;}#togglestate + div{display:none;}#togglestate:checked + div{display:inherit;}main, header{padding:2rem 3vw;}header + main{margin-top:-3rem; [...]
+    <style>/*! content.css */.pdoc{color:var(--text);box-sizing:border-box;line-height:1.5;background:none;}.pdoc .pdoc-button{display:inline-block;border:solid black 1px;border-radius:2px;font-size:.75rem;padding:calc(0.5em - 1px) 1em;transition:100ms all;}.pdoc .pdoc-alert{padding:1rem 1rem 1rem calc(1.5rem + 24px);border:1px solid transparent;border-radius:.25rem;background-repeat:no-repeat;background-position:1rem center;margin-bottom:1rem;}.pdoc .pdoc-alert > *:last-child{margin-bot [...]
+    <style>/*! custom.css */</style></head>
+<body>
+    <nav class="pdoc">
+        <label id="navtoggle" for="togglestate" class="pdoc-button"><svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'><path stroke-linecap='round' stroke="currentColor" stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/></svg></label>
+        <input id="togglestate" type="checkbox" aria-hidden="true" tabindex="-1">
+        <div>            <a class="pdoc-button module-list-button" href="../schema.html">
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-box-arrow-in-left" viewBox="0 0 16 16">
+  <path fill-rule="evenodd" d="M10 3.5a.5.5 0 0 0-.5-.5h-8a.5.5 0 0 0-.5.5v9a.5.5 0 0 0 .5.5h8a.5.5 0 0 0 .5-.5v-2a.5.5 0 0 1 1 0v2A1.5 1.5 0 0 1 9.5 14h-8A1.5 1.5 0 0 1 0 12.5v-9A1.5 1.5 0 0 1 1.5 2h8A1.5 1.5 0 0 1 11 3.5v2a.5.5 0 0 1-1 0v-2z"/>
+  <path fill-rule="evenodd" d="M4.146 8.354a.5.5 0 0 1 0-.708l3-3a.5.5 0 1 1 .708.708L5.707 7.5H14.5a.5.5 0 0 1 0 1H5.707l2.147 2.146a.5.5 0 0 1-.708.708l-3-3z"/>
+</svg>                &nbsp;pulsar.schema</a>
+
+
+            <input type="search" placeholder="Search..." role="searchbox" aria-label="search"
+                   pattern=".+" required>
+
+
+
+        <h2>API Documentation</h2>
+            <ul class="memberlist">
+            <li>
+                    <a class="class" href="#RecordMeta">RecordMeta</a>
+                            <ul class="memberlist">
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Record">Record</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Record.__init__">Record</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Record.schema">schema</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Record.schema_info">schema_info</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Record.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Record.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Record.validate_type">validate_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Record.default">default</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Record.required_default">required_default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Field">Field</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Field.__init__">Field</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Field.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Field.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Field.validate_type">validate_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Field.schema">schema</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Field.schema_info">schema_info</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Field.default">default</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Field.required_default">required_default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Null">Null</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Null.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Null.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Null.validate_type">validate_type</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Boolean">Boolean</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Boolean.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Boolean.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Boolean.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Integer">Integer</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Integer.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Integer.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Integer.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Long">Long</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Long.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Long.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Long.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Float">Float</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Float.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Float.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Float.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Double">Double</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Double.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Double.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Double.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Bytes">Bytes</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Bytes.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Bytes.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Bytes.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#String">String</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#String.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#String.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#String.validate_type">validate_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#String.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#CustomEnum">CustomEnum</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#CustomEnum.__init__">CustomEnum</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#CustomEnum.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#CustomEnum.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#CustomEnum.validate_type">validate_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#CustomEnum.schema">schema</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#CustomEnum.schema_info">schema_info</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#CustomEnum.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Array">Array</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Array.__init__">Array</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Array.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Array.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Array.validate_type">validate_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Array.schema">schema</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Array.schema_info">schema_info</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Array.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="class" href="#Map">Map</a>
+                            <ul class="memberlist">
+                        <li>
+                                <a class="function" href="#Map.__init__">Map</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Map.type">type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Map.python_type">python_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Map.validate_type">validate_type</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Map.schema">schema</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Map.schema_info">schema_info</a>
+                        </li>
+                        <li>
+                                <a class="function" href="#Map.default">default</a>
+                        </li>
+                </ul>
+
+            </li>
+            <li>
+                    <a class="function" href="#is_unicode">is_unicode</a>
+            </li>
+    </ul>
+
+
+
+        <a class="attribution" title="pdoc: Python API documentation generator" href="https://pdoc.dev">
+            built with <span class="visually-hidden">pdoc</span><img
+                alt="pdoc logo"
+                src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20role%3D%22img%22%20aria-label%3D%22pdoc%20logo%22%20width%3D%22300%22%20height%3D%22150%22%20viewBox%3D%22-1%200%2060%2030%22%3E%3Ctitle%3Epdoc%3C/title%3E%3Cpath%20d%3D%22M29.621%2021.293c-.011-.273-.214-.475-.511-.481a.5.5%200%200%200-.489.503l-.044%201.393c-.097.551-.695%201.215-1.566%201.704-.577.428-1.306.486-2.193.182-1.426-.617-2.467-1.654-3.304-2.487l-.173-.172a3.43%203.43%200%200%200-.3 [...]
+        </a>
+</div>
+    </nav>
+    <main class="pdoc">
+            <section>
+                    <h1 class="modulename">
+<a href="./../../pulsar.html">pulsar</a><wbr>.<a href="./../schema.html">schema</a><wbr>.definition    </h1>
+
+                
+                        <details>
+            <summary>View Source</summary>
+            <div class="pdoc-code codehilite"><pre><span></span><span class="c1">#</span>
+<span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements.  See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership.  The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># &quot;License&quot;); you may not use this file except in compliance</span>
+<span class="c1"># with the License.  You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1">#   http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied.  See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="c1">#</span>
+
+<span class="kn">import</span> <span class="nn">copy</span>
+<span class="kn">from</span> <span class="nn">abc</span> <span class="kn">import</span> <span class="n">abstractmethod</span>
+<span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span>
+<span class="kn">from</span> <span class="nn">enum</span> <span class="kn">import</span> <span class="n">Enum</span><span class="p">,</span> <span class="n">EnumMeta</span>
+<span class="kn">from</span> <span class="nn">six</span> <span class="kn">import</span> <span class="n">with_metaclass</span>
+
+
+<span class="k">def</span> <span class="nf">_check_record_or_field</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
+    <span class="k">if</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">type</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">Record</span><span class="p">))</span> \
+            <span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
+        <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s1">&#39;Argument &#39;</span> <span class="o">+</span> <span class="n">x</span> <span class="o">+</span> <span class="s1">&#39; is not a Record or a Field&#39;</span><span class="p">)</span>
+
+
+<span class="k">class</span> <span class="nc">RecordMeta</span><span class="p">(</span><span class="nb">type</span><span class="p">):</span>
+    <span class="k">def</span> <span class="fm">__new__</span><span class="p">(</span><span class="n">metacls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parents</span><span class="p">,</span> <span class="n">dct</span><span class="p">):</span>
+        <span class="k">if</span> <span class="n">name</span> <span class="o">!=</span> <span class="s1">&#39;Record&#39;</span><span class="p">:</span>
+            <span class="c1"># Do not apply this logic to the base class itself</span>
+            <span class="n">dct</span><span class="p">[</span><span class="s1">&#39;_fields&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">RecordMeta</span><span class="o">.</span><span class="n">_get_fields</span><span class="p">(</span><span class="n">dct</span><span class="p">)</span>
+            <span class="n">dct</span><span class="p">[</span><span class="s1">&#39;_required&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">False</span>
+        <span class="k">return</span> <span class="nb">type</span><span class="o">.</span><span class="fm">__new__</span><span class="p">(</span><span class="n">metacls</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">parents</span><span class="p">,</span> <span class="n">dct</span><span class="p">)</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">_get_fields</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">dct</span><span class="p">):</span>
+        <span class="c1"># Build a set of valid fields for this record</span>
+        <span class="n">fields</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>
+        <span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">dct</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">EnumMeta</span><span class="p">):</span>
+                <span class="n">value</span> <span class="o">=</span> <span class="n">CustomEnum</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+            <span class="k">elif</span> <span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">)</span> <span class="o">==</span> <span class="n">RecordMeta</span><span class="p">:</span>
+                <span class="c1"># We expect an instance of a record rather than the class itself</span>
+                <span class="n">value</span> <span class="o">=</span> <span class="n">value</span><span class="p">()</span>
+
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">or</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Field</span><span class="p">):</span>
+                <span class="n">fields</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
+        <span class="k">return</span> <span class="n">fields</span>
+
+
+<span class="k">class</span> <span class="nc">Record</span><span class="p">(</span><span class="n">with_metaclass</span><span class="p">(</span><span class="n">RecordMeta</span><span class="p">,</span> <span class="nb">object</span><span class="p">)):</span>
+
+    <span class="c1"># This field is used to set namespace for Avro Record schema.</span>
+    <span class="n">_avro_namespace</span> <span class="o">=</span> <span class="kc">None</span>
+
+    <span class="c1"># Generate a schema where fields are sorted alphabetically</span>
+    <span class="n">_sorted_fields</span> <span class="o">=</span> <span class="kc">False</span>
+
+    <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">required_default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">*</ [...]
+        <span class="bp">self</span><span class="o">.</span><span class="n">_required_default</span> <span class="o">=</span> <span class="n">required_default</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_default</span> <span class="o">=</span> <span class="n">default</span>
+        <span class="bp">self</span><span class="o">.</span><span class="n">_required</span> <span class="o">=</span> <span class="n">required</span>
+
+        <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fields</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+            <span class="k">if</span> <span class="n">k</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
+                <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="nb">dict</span><span class="p">):</span>
+                    <span class="c1"># Use dict init Record object</span>
+                    <span class="n">copied</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
+                    <span class="n">copied</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">copied</span><span class="p">)</span>
+                <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Array</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="nb">list</span><span class="p">)</span> <span class="ow">and</span> <span class="n [...]
+                        <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">array_type</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="mi">0</span><span [...]
+                    <span class="n">arr</span> <span class="o">=</span> <span class="p">[]</span>
+                    <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">]:</span>
+                        <span class="n">copied</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">array_type</span><span class="p">)</span>
+                        <span class="n">copied</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">item</span><span class="p">)</span>
+                        <span class="n">arr</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">copied</span><span class="p">)</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">arr</span><span class="p">)</span>
+                <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Map</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">],</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">and</span> <span class="nb" [...]
+                    <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">value_type</span><span class="p">,</span> <span class="n">Record</span><span class="p">)</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span c [...]
+                    <span class="n">dic</span> <span class="o">=</span> <span class="p">{}</span>
+                    <span class="k">for</span> <span class="n">mapKey</span><span class="p">,</span> <span class="n">mapValue</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+                        <span class="n">copied</span> <span class="o">=</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">value</span><span class="o">.</span><span class="n">value_type</span><span class="p">)</span>
+                        <span class="n">copied</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="o">**</span><span class="n">mapValue</span><span class="p">)</span>
+                        <span class="n">dic</span><span class="p">[</span><span class="n">mapKey</span><span class="p">]</span> <span class="o">=</span> <span class="n">copied</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">dic</span><span class="p">)</span>
+                <span class="k">else</span><span class="p">:</span>
+                    <span class="c1"># Value was overridden at constructor</span>
+                    <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
+            <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Record</span><span class="p">):</span>
+                <span class="c1"># Value is a subrecord</span>
+                <span class="bp">self</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="c1"># Set field to default value, without revalidating the default value type</span>
+                <span class="nb">super</span><span class="p">(</span><span class="n">Record</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__setattr__</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">value</span><span class="o">.</span><span class="n">default</span><span class="p">())</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">schema</span><span class="p">(</span><span class="bp">cls</span><span class="p">):</span>
+        <span class="k">return</span> <span class="bp">cls</span><span class="o">.</span><span class="n">schema_info</span><span class="p">(</span><span class="nb">set</span><span class="p">())</span>
+
+    <span class="nd">@classmethod</span>
+    <span class="k">def</span> <span class="nf">schema_info</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">defined_names</span><span class="p">):</span>
+        <span class="n">namespace_prefix</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
+        <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">namespace_prefix</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span> <span class="o">+</span> <span class="s1">&#39;.&#39;</span>
+        <span class="n">namespace_name</span> <span class="o">=</span> <span class="n">namespace_prefix</span> <span class="o">+</span> <span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span>
+
+        <span class="k">if</span> <span class="n">namespace_name</span> <span class="ow">in</span> <span class="n">defined_names</span><span class="p">:</span>
+            <span class="k">return</span> <span class="n">namespace_name</span>
+
+        <span class="n">defined_names</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">namespace_name</span><span class="p">)</span>
+
+        <span class="n">schema</span> <span class="o">=</span> <span class="p">{</span>
+            <span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="s1">&#39;record&#39;</span><span class="p">,</span>
+            <span class="s1">&#39;name&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="vm">__name__</span><span class="p">)</span>
+        <span class="p">}</span>
+        <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
+            <span class="n">schema</span><span class="p">[</span><span class="s1">&#39;namespace&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_avro_namespace</span>
+        <span class="n">schema</span><span class="p">[</span><span class="s1">&#39;fields&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+
+        <span class="k">def</span> <span class="nf">get_filed_default_value</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
+            <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
+                <span class="k">return</span> <span class="n">value</span><span class="o">.</span><span class="n">name</span>
+            <span class="k">else</span><span class="p">:</span>
+                <span class="k">return</span> <span class="n">value</span>
+
+        <span class="k">if</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_sorted_fields</span><span class="p">:</span>
+            <span class="n">fields</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="bp">cls</span><span class="o">.</span><span class="n">_fields</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
+        <span class="k">else</span><span class="p">:</span>
+            <span class="n">fields</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_fields</span><span class="o">.</span><span class="n">keys</span><span class="p">()</span>
+        <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">fields</span><span class="p">:</span>
+            <span class="n">field</span> <span class="o">=</span> <span class="bp">cls</span><span class="o">.</span><span class="n">_fields</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
+            <span class="n">field_type</span> <span class="o">=</span> <span class="n">field</span><span class="o">.</span><span class="n">schema_info</span><span class="p">(</span><span class="n">defined_names</span><span class="p">)</span> \
+                <span class="k">if</span> <span class="n">field</span><span class="o">.</span><span class="n">_required</span> <span class="k">else</span> <span class="p">[</span><span class="s1">&#39;null&#39;</span><span class="p">,</span> <span class="n">field</span><span class="o">.</span><span class="n">schema_info</span><span class="p">(</span><span class="n">defined_names</span><span class="p">)]</span>
+            <span class="n">schema</span><span class="p">[</span><span class="s1">&#39;fields&#39;</span><span class="p">]</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
... 4245 lines suppressed ...