High-performance Python bindings for a Rust-based Kafka client
Project description
Prosody: Python Bindings for Kafka
Prosody offers Python bindings to the Prosody Kafka client, providing features for message production and consumption, including configurable retry mechanisms, failure handling strategies, and integrated OpenTelemetry support for distributed tracing.
Features
- Kafka Consumer: Per-key ordering with cross-key concurrency, offset management, consumer groups
- Kafka Producer: Idempotent delivery with configurable retries
- Timer System: Persistent scheduled execution backed by Cassandra or in-memory store
- Quality of Service: Fair scheduling limits concurrency and prevents failures from starving fresh traffic. Pipeline mode adds deferred retry and monopolization detection
- Distributed Tracing: OpenTelemetry integration for tracing message flow across services
- Backpressure: Pauses partitions when handlers fall behind
- Mocking: In-memory Kafka broker for tests (
mock=True) - Failure Handling: Pipeline (retry forever), Low-Latency (dead letter), Best-Effort (log and skip)
Installation
Prosody supports Python 3.8 and above, including free-threaded builds (3.13t, 3.14t). Install from PyPI:
pip install prosody-events
Quick Start
from prosody import ProsodyClient, EventHandler, Context, Message
import datetime
# Initialize the client with Kafka bootstrap server, consumer group, and topics
client = ProsodyClient(
# Bootstrap servers should normally be set using the PROSODY_BOOTSTRAP_SERVERS environment variable
bootstrap_servers="localhost:9092",
# To allow loopbacks, the source_system must be different from the group_id.
# Normally, the source_system would be left unspecified, which would default to the group_id.
source_system="my-application-source",
# The group_id should be set to the name of your application
group_id="my-application",
# Topics the client should subscribe to
subscribed_topics="my-topic"
)
# Define a custom message handler
class MyHandler(EventHandler):
async def on_message(self, context: Context, message: Message) -> None:
# Process the received message
print(f"Received message: {message}")
# Schedule a timer for delayed processing (requires Cassandra unless mock: True)
if message.payload.get("schedule_followup"):
future_time = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=30)
await context.schedule(future_time)
async def on_timer(self, context: Context, timer) -> None:
# Handle timer firing
print(f"Timer fired for key: {timer.key} at {timer.time}")
# Subscribe to messages using the custom handler
client.subscribe(MyHandler())
# Send a message to a topic
await client.send("my-topic", "message-key", {"content": "Hello, Kafka!"})
# Ensure proper shutdown when done
await client.unsubscribe()
Architecture
Prosody enables efficient, parallel processing of Kafka messages while maintaining order for messages with the same key:
- Partition-Level Parallelism: Separate management of each Kafka partition
- Key-Based Queuing: Ordered processing for each key within a partition
- Concurrent Processing: Simultaneous processing of different keys
- Backpressure Management: Pause consumption from backed-up partitions
Quality of Service
All modes use fair scheduling to limit concurrency and distribute execution time. Pipeline mode adds deferred retry and monopolization detection.
Fair Scheduling (All Modes)
The scheduler controls which message runs next and how many run concurrently.
Virtual Time (VT): Each key accumulates VT equal to its handler execution time. The scheduler picks the key with the lowest VT. A key that runs for 500ms accumulates 500ms of VT; a key that hasn't run recently has zero VT and gets priority.
Two-Class Split: Normal messages and failure retries have separate VT pools. The scheduler allocates execution time between them (default: 70% normal, 30% failure). During a failure spike, retries get at most 30% of execution time—fresh messages continue processing.
Starvation Prevention: Tasks receive a quadratic priority boost based on wait time. A task waiting 2 minutes (configurable) gets maximum boost, overriding VT disadvantage.
Deferred Retry (Pipeline Mode)
Moves failing keys to timer-based retry so the partition can continue processing other keys.
On transient failure: store the message offset in Cassandra, schedule a timer, return success. The partition advances. When the timer fires, reload the message from Kafka and retry.
# Configure defer behavior
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
defer_enabled=True, # Enable deferral (default: True)
defer_base=1.0, # Wait 1s before first retry
defer_max_delay=86400.0, # Cap at 24 hours
defer_failure_threshold=0.9, # Disable when >90% failing
)
Failure Rate Gating: When >90% of recent messages fail, deferral disables. The retry middleware blocks the partition, applying backpressure upstream.
Monopolization Detection (Pipeline Mode)
Rejects keys that consume too much execution time.
The middleware tracks per-key execution time in 5-minute rolling windows. Keys exceeding 90% of window time are rejected with a transient error, routing them through defer.
# Configure monopolization detection
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
monopolization_enabled=True, # Enable detection (default: True)
monopolization_threshold=0.9, # Reject keys using >90% of window
monopolization_window=300.0, # 5-minute window
)
Handler Timeout
Handlers are automatically cancelled if they exceed a deadline:
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
timeout=30.0, # Cancel after 30 seconds
stall_threshold=60.0, # Report unhealthy after 60 seconds
)
When a handler times out, context.should_cancel() returns True and await context.on_cancel() completes. The handler
should exit promptly. If not specified, timeout defaults to 80% of stall_threshold.
Configuration
Configure via constructor options or environment variables. Options fall back to environment variables when unset.
Core
| Option / Environment Variable | Description | Default |
|---|---|---|
bootstrap_servers / PROSODY_BOOTSTRAP_SERVERS |
Kafka servers to connect to | - |
group_id / PROSODY_GROUP_ID |
Consumer group name | - |
subscribed_topics / PROSODY_SUBSCRIBED_TOPICS |
Topics to read from | - |
allowed_events / PROSODY_ALLOWED_EVENTS |
Only process events matching these prefixes | (all) |
source_system / PROSODY_SOURCE_SYSTEM |
Tag for outgoing messages (prevents reprocessing) | <group_id> |
mock / PROSODY_MOCK |
Use in-memory Kafka for testing | False |
Consumer
| Option / Environment Variable | Description | Default |
|---|---|---|
max_concurrency / PROSODY_MAX_CONCURRENCY |
Max messages being processed simultaneously | 32 |
max_uncommitted / PROSODY_MAX_UNCOMMITTED |
Max queued messages before pausing consumption | 64 |
timeout / PROSODY_TIMEOUT |
Cancel handler if it runs longer than this | 80% of stall threshold |
commit_interval / PROSODY_COMMIT_INTERVAL |
How often to save progress to Kafka | 1s |
poll_interval / PROSODY_POLL_INTERVAL |
How often to fetch new messages from Kafka | 100ms |
shutdown_timeout / PROSODY_SHUTDOWN_TIMEOUT |
Shutdown budget; handlers run freely until cancellation fires near the end of the timeout | 30s |
stall_threshold / PROSODY_STALL_THRESHOLD |
Report unhealthy if no progress for this long | 5m |
probe_port / PROSODY_PROBE_PORT |
HTTP port for health checks (None to disable) | 8000 |
failure_topic / PROSODY_FAILURE_TOPIC |
Send unprocessable messages here (dead letter queue) | - |
idempotence_cache_size / PROSODY_IDEMPOTENCE_CACHE_SIZE |
Global shared cache capacity across all partitions. Set to 0 to disable the entire deduplication middleware (both in-memory and Cassandra tiers). |
8192 |
idempotence_version / PROSODY_IDEMPOTENCE_VERSION |
Version string for cache-busting dedup hashes | "1" |
idempotence_ttl / PROSODY_IDEMPOTENCE_TTL |
TTL for dedup records in Cassandra | 7d (604800 seconds) |
slab_size / PROSODY_SLAB_SIZE |
Timer storage granularity (rarely needs changing) | 1h |
message_spans / PROSODY_MESSAGE_SPANS |
Span linking for message execution: child (child-of) or follows_from |
child |
timer_spans / PROSODY_TIMER_SPANS |
Span linking for timer execution: child (child-of) or follows_from |
follows_from |
Producer
| Option / Environment Variable | Description | Default |
|---|---|---|
send_timeout / PROSODY_SEND_TIMEOUT |
Give up sending after this long | 1s |
Retry
When a handler fails, retry with exponential backoff:
| Option / Environment Variable | Description | Default |
|---|---|---|
max_retries / PROSODY_MAX_RETRIES |
Give up after this many attempts | 3 |
retry_base / PROSODY_RETRY_BASE |
Wait this long before first retry | 20ms |
max_retry_delay / PROSODY_RETRY_MAX_DELAY |
Never wait longer than this | 5m |
Deferral (Pipeline Mode)
| Option / Environment Variable | Description | Default |
|---|---|---|
defer_enabled / PROSODY_DEFER_ENABLED |
Enable deferral for new messages | true |
defer_base / PROSODY_DEFER_BASE |
Wait this long before first deferred retry | 1s |
defer_max_delay / PROSODY_DEFER_MAX_DELAY |
Never wait longer than this | 24h |
defer_failure_threshold / PROSODY_DEFER_FAILURE_THRESHOLD |
Disable deferral when failure rate exceeds this | 0.9 |
defer_failure_window / PROSODY_DEFER_FAILURE_WINDOW |
Measure failure rate over this time window | 5m |
defer_cache_size / PROSODY_DEFER_CACHE_SIZE |
Track this many deferred keys in memory | 1024 |
defer_store_cache_size / PROSODY_DEFER_STORE_CACHE_SIZE |
Maximum deferred store cache entries per Cassandra defer store | 8192 |
defer_seek_timeout / PROSODY_DEFER_SEEK_TIMEOUT |
Timeout when loading deferred messages | 30s |
defer_discard_threshold / PROSODY_DEFER_DISCARD_THRESHOLD |
Read optimization (rarely needs changing) | 100 |
Monopolization Detection (Pipeline Mode)
| Option / Environment Variable | Description | Default |
|---|---|---|
monopolization_enabled / PROSODY_MONOPOLIZATION_ENABLED |
Enable hot key protection | true |
monopolization_threshold / PROSODY_MONOPOLIZATION_THRESHOLD |
Max handler time as fraction of window | 0.9 |
monopolization_window / PROSODY_MONOPOLIZATION_WINDOW |
Measurement window | 5m |
monopolization_cache_size / PROSODY_MONOPOLIZATION_CACHE_SIZE |
Max distinct keys to track | 8192 |
Fair Scheduling (All Modes)
| Option / Environment Variable | Description | Default |
|---|---|---|
scheduler_failure_weight / PROSODY_SCHEDULER_FAILURE_WEIGHT |
Fraction of processing time reserved for retries | 0.3 |
scheduler_max_wait / PROSODY_SCHEDULER_MAX_WAIT |
Messages waiting this long get maximum priority | 2m |
scheduler_wait_weight / PROSODY_SCHEDULER_WAIT_WEIGHT |
Priority boost for waiting messages (higher = more aggressive) | 200.0 |
scheduler_cache_size / PROSODY_SCHEDULER_CACHE_SIZE |
Max distinct keys to track | 8192 |
Telemetry Emitter
Prosody emits internal lifecycle events (message dispatched/succeeded/failed, timer scheduled/fired, producer sends) to a Kafka topic for observability:
| Option / Environment Variable | Description | Default |
|---|---|---|
telemetry_topic / PROSODY_TELEMETRY_TOPIC |
Kafka topic to produce telemetry events to | prosody.telemetry-events |
telemetry_enabled / PROSODY_TELEMETRY_ENABLED |
Enable or disable the telemetry emitter | true |
Cassandra
Persistent storage for timers and deferred retries (not needed if mock=True):
| Option / Environment Variable | Description | Default |
|---|---|---|
cassandra_nodes / PROSODY_CASSANDRA_NODES |
Servers to connect to (host:port) | - |
cassandra_keyspace / PROSODY_CASSANDRA_KEYSPACE |
Keyspace name | prosody |
cassandra_user / PROSODY_CASSANDRA_USER |
Username | - |
cassandra_password / PROSODY_CASSANDRA_PASSWORD |
Password | - |
cassandra_datacenter / PROSODY_CASSANDRA_DATACENTER |
Prefer this datacenter for queries | - |
cassandra_rack / PROSODY_CASSANDRA_RACK |
Prefer this rack for queries | - |
cassandra_retention / PROSODY_CASSANDRA_RETENTION |
Delete data older than this | 1y |
Liveness and Readiness Probes
Prosody includes a built-in probe server for consumer-based applications that provides health check endpoints. The probe server is tied to the consumer's lifecycle and offers two main endpoints:
-
/readyz: A readiness probe that checks if any partitions are assigned to the consumer. Returns a success status only when the consumer has at least one partition assigned, indicating it's ready to process messages. -
/livez: A liveness probe that checks if any partitions have stalled (haven't processed a message within a configured time threshold).
Configure the probe server using either the client constructor:
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
probe_port=8000, # Set to None to disable
stall_threshold=15.0 # Seconds before considering a partition stalled
)
Or via environment variables:
PROSODY_PROBE_PORT=8000 # Set to 'none' to disable
PROSODY_STALL_THRESHOLD=15s # Default stall detection threshold
Important Notes
- The probe server starts automatically when the consumer is subscribed and stops when unsubscribed.
- A partition is considered "stalled" if it hasn't processed a message within the
stall_thresholdduration. - The stall threshold should be set based on your application's message processing latency and expected message frequency.
- Setting the threshold too low might cause false positives, while setting it too high could delay detection of actual issues.
- The probe server is only active when consuming messages (not for producer-only usage).
Advanced Usage
Pipeline Mode
Pipeline mode is the default mode. Ensures ordered processing, retrying failed operations indefinitely:
# Initialize client in pipeline mode
client = ProsodyClient(
mode="pipeline", # Explicitly set pipeline mode (this is the default)
group_id="my-consumer-group",
subscribed_topics="my-topic"
)
Low-Latency Mode
Prioritizes quick processing, sending persistently failing messages to a failure topic:
# Initialize client in low-latency mode
client = ProsodyClient(
mode="low-latency", # Set low-latency mode
group_id="my-consumer-group",
subscribed_topics="my-topic",
failure_topic="failed-messages" # Specify a topic for failed messages
)
Best-Effort Mode
Optimized for development environments or services where message processing failures are acceptable:
# Initialize client in best-effort mode
client = ProsodyClient(
mode="best-effort", # Set best-effort mode
group_id="my-consumer-group",
subscribed_topics="my-topic"
)
Event Type Filtering
Prosody supports filtering messages based on event type prefixes, allowing your consumer to process only specific types of events:
# Process only events with types starting with "user." or "account."
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
allowed_events=["user.", "account."]
)
Or via environment variables:
PROSODY_ALLOWED_EVENTS=user.,account.
Matching Behavior
Prefixes must match exactly from the start of the event type:
✓ Matches:
{"type": "user.created"}matches prefixuser.{"type": "account.deleted"}matches prefixaccount.
✗ No Match:
{"type": "admin.user.created"}doesn't matchuser.{"type": "my.account.deleted"}doesn't matchaccount.{"type": "notification"}doesn't match any prefix
If no prefixes are configured, all messages are processed. Messages without a type field are always processed.
Source System Deduplication
Prosody prevents processing loops in distributed systems by tracking the source of each message:
# Consumer and producer in one application
client = ProsodyClient(
group_id="my-service",
source_system="my-service-producer", # Must differ from groupId to allow loopbacks; defaults to groupId
subscribed_topics="my-topic"
)
Or via environment variable:
PROSODY_SOURCE_SYSTEM=my-service-producer
How It Works
- Producers add a
source-systemheader to all outgoing messages. - Consumers check this header on incoming messages.
- If a message's source system matches the consumer's group ID, the message is skipped.
This prevents endless loops where a service consumes its own produced messages.
Message Deduplication
Prosody automatically deduplicates messages using the id field in their JSON payload. Messages with the same ID and
key are processed only once.
Deduplication uses a two-tier architecture:
- Global in-memory cache: A single LRU cache shared across all partitions in the process. Because it is shared, it survives partition reassignments within the same process, reducing duplicate work during rebalances.
- Cassandra-backed persistent store: Deduplication records written to Cassandra survive process restarts and cross-instance rebalances, providing durable protection against duplicates.
# Messages with IDs are deduplicated per key
await client.send("my-topic", "key1", {
"id": "msg-123", # Message will be processed
"content": "Hello!"
})
await client.send("my-topic", "key1", {
"id": "msg-123", # Message will be skipped (duplicate)
"content": "Hello again!"
})
await client.send("my-topic", "key2", {
"id": "msg-123", # Message will be processed (different key)
"content": "Hello!"
})
The entire deduplication middleware (both the in-memory cache and the Cassandra-backed persistent store) can be disabled by setting idempotence_cache_size=0:
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
idempotence_cache_size=0 # Disable deduplication entirely
)
Or via environment variable:
PROSODY_IDEMPOTENCE_CACHE_SIZE=0
To invalidate all previously recorded deduplication entries (e.g. after a data migration), change idempotence_version:
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
idempotence_version="2" # All entries recorded under version "1" are ignored
)
The idempotence_ttl option controls how long deduplication records are retained in Cassandra (default: 7 days). Set
this to match your expected message redelivery window:
from datetime import timedelta
client = ProsodyClient(
group_id="my-consumer-group",
subscribed_topics="my-topic",
idempotence_ttl=timedelta(days=7) # also accepts seconds as a float (e.g. 604800.0)
)
Timer Functionality
Prosody supports timer-based delayed execution within message handlers. When a timer fires, your handler's on_timer method will be called:
import datetime
from prosody import EventHandler, Context, Message
class MyHandler(EventHandler):
async def on_message(self, context: Context, message: Message) -> None:
# Schedule a timer to fire in 30 seconds
future_time = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(seconds=30)
await context.schedule(future_time)
# Schedule multiple timers
one_minute = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=1)
two_minutes = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(minutes=2)
await context.schedule(one_minute)
await context.schedule(two_minutes)
# Check what's scheduled
scheduled_times = await context.scheduled()
print(f"Scheduled timers: {len(scheduled_times)}")
async def on_timer(self, context: Context, timer) -> None:
print("Timer fired!")
print(f"Key: {timer.key}")
print(f"Scheduled time: {timer.time}")
Timer Methods
The context provides timer scheduling methods that allow you to delay execution or implement timeout behavior:
schedule(time): Schedules a timer to fire at the specified timeclear_and_schedule(time): Clears all timers and schedules a new oneunschedule(time): Removes a timer scheduled for the specified timeclear_scheduled(): Removes all scheduled timersscheduled(): Returns a list of all scheduled timer times
Timer Object
When a timer fires, the on_timer method receives a timer object with these properties:
key(str): The entity key identifying what this timer belongs totime(datetime): The time when this timer was scheduled to fire
Note: Timer precision is limited to seconds due to the underlying storage format. Sub-second precision in scheduled times will be rounded to the nearest second.
Timer Configuration
Timer functionality requires Cassandra for persistence unless running in mock mode. Configure Cassandra connection via environment variable:
PROSODY_CASSANDRA_NODES=localhost:9042 # Required for timer persistence
Or programmatically when creating the client:
client = ProsodyClient(
bootstrap_servers="localhost:9092",
group_id="my-application",
subscribed_topics="my-topic",
cassandra_nodes="localhost:9042" # Required unless mock=True
)
For testing, you can use mock mode to avoid Cassandra dependency:
# Mock mode for testing (timers work but aren't persisted)
client = ProsodyClient(
bootstrap_servers="localhost:9092",
group_id="my-application",
subscribed_topics="my-topic",
mock=True # No Cassandra required in mock mode
)
OpenTelemetry Tracing
Prosody supports OpenTelemetry tracing, allowing you to monitor and analyze the performance of your Kafka-based
applications. The library will emit traces using the OTLP protocol if the OTEL_EXPORTER_OTLP_ENDPOINT environment
variable is defined.
Note: Prosody emits its own traces separately because it uses its own tracing runtime, as it would be expensive to send all traces to Python.
Required Packages
To use OpenTelemetry tracing with Prosody, you need to install the following packages:
opentelemetry-sdk>=1.26.0
opentelemetry-api>=1.26.0
opentelemetry-exporter-otlp-proto-grpc>=1.26.0
Initializing Tracing
To initialize tracing in your application:
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
traceProvider = TracerProvider()
processor = BatchSpanProcessor(OTLPSpanExporter())
traceProvider.add_span_processor(processor)
trace.set_tracer_provider(traceProvider)
# Creates a tracer from the global tracer provider
tracer = trace.get_tracer(__name__)
Setting OpenTelemetry Environment Variables
Set the following standard OpenTelemetry environment variables:
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
OTEL_SERVICE_NAME=my-service-name
For more information on these and other OpenTelemetry environment variables, refer to the OpenTelemetry specification.
Using Tracing in Your Application
After initializing tracing, you can define spans in your application, and they will be properly propagated through Kafka:
class MyHandler(EventHandler):
async def on_message(self, context: Context, message: Message) -> None:
with tracer.start_as_current_span("test-receive"):
# Process the received message
print(f"Received message: {message}")
Span Linking
By default, message execution spans use child (child-of relationship — the execution span is part of
the same trace as the producer). Timer execution spans use follows_from (the execution span starts a
new trace with a span link back to the scheduling span, since timer execution is causally related but not part of
the same operation).
Both strategies are configurable via the message_spans / PROSODY_MESSAGE_SPANS and timer_spans /
PROSODY_TIMER_SPANS options. Accepted values: child, follows_from.
Best Practices
🔥 ☢️ DANGER: NEVER SHARE EVENTHANDLER STATE ACROSS CALLS ☢️ 🔥
Your event handler class methods will be called concurrently. NEVER use mutable shared state across event handler calls, like setting instance variables. Sharing state can introduce subtle data races and corruption that may only appear in production. If you absolutely must use non-local mutable state, ensure that you know what you're doing and use appropriate synchronization primitives.
Ensuring Idempotent Message Handlers
Idempotent message handlers are crucial for maintaining data consistency, fault tolerance, and scalability when working with distributed, event-based systems. They ensure that processing a message multiple times has the same effect as processing it once, which is essential for recovering from failures.
Strategies for achieving idempotence:
-
Natural Idempotence: Use inherently idempotent operations (e.g., setting a value in a key-value store).
-
Deduplication with Unique Identifiers:
- Kafka messages can be uniquely identified by their partition and offset.
- Before processing, check if the message has been handled before.
- Store processed message identifiers with an appropriate TTL.
-
Database Upserts: Use upsert operations for database writes (e.g.,
INSERT ... ON CONFLICT DO UPDATEin PostgreSQL). -
Partition Offset Tracking:
- Store the latest processed offset for each partition.
- Only process messages with higher offsets than the last processed one.
- Critically, store these offsets transactionally with other state updates to ensure consistency.
-
Idempotency Keys for External APIs: Utilize idempotency keys when supported by external APIs.
-
Check-then-Act Pattern:
- For non-idempotent external systems, verify if an operation was previously completed before execution.
- Maintain a record of completed operations, keyed by a unique message identifier.
- Saga Pattern:
- Implement a state machine in your database for multi-step operations.
- Each message advances the state machine, allowing for idempotent processing and easy failure recovery.
- Particularly useful for complex, distributed transactions across multiple services.
Proper Shutdown
Always unsubscribe from topics before exiting your application:
# Ensure proper shutdown
await client.unsubscribe()
This ensures:
- Completion and commitment of all in-flight work
- Quick rebalancing, allowing other consumers to take over partitions
- Proper release of resources
Implement shutdown handling in your application using an asyncio event:
import asyncio
import signal
from prosody import ProsodyClient
async def main():
# Create an event to signal when to shut down
shutdown_event = asyncio.Event()
# Set up signal handlers
for sig in (signal.SIGTERM, signal.SIGINT, signal.SIGHUP):
asyncio.get_running_loop().add_signal_handler(
sig, lambda s=sig: asyncio.create_task(shutdown(shutdown_event, s))
)
client = ProsodyClient(
bootstrap_servers="localhost:9092",
group_id="my-consumer-group",
subscribed_topics="my-topic"
)
# Subscribe to messages using your custom handler
client.subscribe(MyHandler())
# Wait for the shutdown event
await shutdown_event.wait()
# Unsubscribe
await client.unsubscribe()
async def shutdown(event: asyncio.Event, signal: signal.Signals):
print(f"Received signal {signal.name}. Initiating shutdown...")
event.set()
if __name__ == '__main__':
asyncio.run(main())
Error Handling
Prosody classifies errors as transient (temporary, can be retried) or permanent (won't be resolved by retrying). By default, all errors are considered transient.
Use the @permanent decorator to classify exceptions that should not be retried:
from prosody import EventHandler, Context, Message, permanent
class MyHandler(EventHandler):
@permanent(TypeError, AttributeError)
async def on_message(self, context: Context, message: Message):
# Your message handling logic here
# TypeError and AttributeError will be treated as permanent
# All other exceptions will be treated as transient (default behavior)
pass
Best practices:
- Use permanent errors for issues like malformed data or business logic violations.
- Use transient errors for temporary issues like network problems.
- Be cautious with permanent errors as they prevent retries and can result in data loss.
- Consider system reliability and data consistency when classifying errors.
Handling Task Cancellation
Prosody cancels tasks during partition rebalancing, timeout, or shutdown. During shutdown, handlers run freely for most of the shutdown_timeout before the cancellation signal fires — giving in-flight work time to complete. How you handle cancellation is critical:
- Prosody interprets task success based on exception propagation.
- A task that exits without an exception is considered successful.
- Any exception signals task failure.
Best practices:
- Exit promptly when cancelled to avoid rebalancing delays.
- Use
try/finallyor context managers for clean resource handling.
Failing to follow these practices can lead to slower message processing due to delayed rebalancing.
Release Process
Prosody uses an automated release process managed by GitHub Actions. Here's an overview of how releases are handled:
-
Trigger: The release process is triggered automatically on pushes to the
mainbranch. -
Release Please: The process starts with the "Release Please" action, which:
- Analyzes commit messages since the last release.
- Creates or updates a release pull request with changelog updates and version bumps.
- When the PR is merged, it creates a GitHub release and a git tag.
-
Build Process: If a new release is created, the following build jobs are triggered:
- Linux builds for x86_64 and aarch64 architectures.
- MuslLinux builds for the same architectures.
- Windows build for x64 architecture.
- macOS build for aarch64 architecture.
- Source distribution (sdist) build.
-
Artifact Upload: Each build job uploads its artifacts (wheels or sdist) to GitHub Actions.
-
Publication: If all builds are successful, the final step publishes the built artifacts to PyPI.
Contributing to Releases
To contribute to a release:
- Make your changes in a feature branch.
- Use Conventional Commits syntax for your commit messages. This helps Release Please determine the next version number and generate the changelog.
- Create a pull request to merge your changes into the
mainbranch. - Once your PR is approved and merged, Release Please will include your changes in the next release PR.
Manual Releases
While the process is automated, manual intervention may sometimes be necessary:
- You can manually trigger the release workflow from the GitHub Actions tab if needed.
- If you need to make changes to the release PR created by Release Please, you can do so before merging it.
Remember, all releases are automatically published to PyPI. Ensure you have thoroughly tested your changes before
merging to main.
Administrative Operations
⚠️ Important Note: Topic management in production environments should typically be handled through GitOps using Strimzi KafkaTopic manifests. The AdminClient is provided for testing scenarios and specific cases where the data team requires manual topic creation and deletion.
AdminClient
The AdminClient provides administrative operations for Kafka topics:
from prosody import AdminClient
# Initialize admin client
admin = AdminClient(bootstrap_servers="localhost:9092")
# Create a topic for testing
await admin.create_topic(
"test-topic",
partition_count=4,
replication_factor=1,
cleanup_policy="delete",
retention=datetime.timedelta(days=7) # or retention=604800.0 (seconds)
)
# Delete a topic
await admin.delete_topic("test-topic")
Configuration Parameters
The AdminClient constructor accepts:
bootstrap_servers(str | list[str]): Kafka bootstrap servers (required)
Or via environment variable:
PROSODY_BOOTSTRAP_SERVERS=localhost:9092 # Single server
PROSODY_BOOTSTRAP_SERVERS=localhost:9092,localhost:9093 # Multiple servers
Topic Configuration Options
When creating topics, the following options are supported:
partition_count(int): Number of partitions (optional, uses broker default)replication_factor(int): Replication factor (optional, uses broker default)cleanup_policy(str): Cleanup policy such as "delete" or "compact" (optional)retention(timedelta | float): Message retention time as timedelta object or seconds as float (optional)
These can also be configured via environment variables:
PROSODY_TOPIC_PARTITIONS=4 # Number of partitions
PROSODY_TOPIC_REPLICATION_FACTOR=1 # Replication factor
PROSODY_TOPIC_CLEANUP_POLICY=delete # Cleanup policy
PROSODY_TOPIC_RETENTION=7d # Retention as humantime string (7d, 2h 30m, etc.)
API Reference
ProsodyClient
__init__(**config): Initialize a new ProsodyClient with the given configuration.send(topic: str, key: str, payload: Any) -> None: Send a message to a specified topic.consumer_state() -> str: Get the current state of the consumer.subscribe(handler: EventHandler) -> None: Subscribe to messages using the provided handler.unsubscribe() -> None: Unsubscribe from messages and shut down the consumer.
AdminClient
__init__(**config): Initialize a new AdminClient with the given configuration.create_topic(name: str, **config) -> None: Create a Kafka topic with optional configuration parameters.delete_topic(name: str) -> None: Delete an existing Kafka topic.
EventHandler
An abstract base class for user-defined handlers:
class EventHandler(ABC):
@abstractmethod
async def on_message(self, context: Context, message: Message) -> None:
# Implement your message handling logic here
pass
@abstractmethod
async def on_timer(self, context: Context, timer: Timer) -> None:
# Implement your timer handling logic here
pass
Note: The on_message method may be called from different threads. Ensure that any handler state is thread-safe. If library incompatibility becomes an issue, this may be changed in the future so all handler calls originate from the same thread,
Message
Represents a Kafka message as a frozen dataclass with the following attributes:
topic: str: The name of the topic.partition: int: The partition number.offset: int: The message offset within the partition.timestamp: datetime: The timestamp when the message was created or sent.key: str: The message key.payload: JSONValue: The message payload as a JSON-serializable value.
Context
Represents the context of a Kafka message, providing timer scheduling methods:
schedule(time: datetime) -> None: Schedules a timer to fire at the specified timeclear_and_schedule(time: datetime) -> None: Clears all timers and schedules a new oneunschedule(time: datetime) -> None: Removes a timer scheduled for the specified timeclear_scheduled() -> None: Removes all scheduled timersscheduled() -> List[datetime]: Returns a list of all scheduled timer timesshould_cancel() -> bool: Check if cancellation has been requested (includes timeout and shutdown)on_cancel() -> Coroutine: Awaitable that completes when cancellation is signaled
Timer
Represents a timer that has fired, provided to the on_timer method:
key: str: The entity key identifying what this timer belongs totime: datetime: The time when this timer was scheduled to fire
License
This project is licensed under the MIT License - see the LICENSE file for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file prosody_events-0.2.0.tar.gz.
File metadata
- Download URL: prosody_events-0.2.0.tar.gz
- Upload date:
- Size: 91.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c02a09a9dd45d95fc04530e7aa28070389d1ef2d82e2f0a012f0dc0c46c62d50
|
|
| MD5 |
ff5ab26e3c1dbe54f0e0d5f5bc5d41df
|
|
| BLAKE2b-256 |
3715abe4f83359f5cad7e31b27d4a2b65d294c89b8577a6d382aef67da323164
|
File details
Details for the file prosody_events-0.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: PyPy, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c0d4ec7802475883256028105881a19cc858ca537f9d692d618b4d8972db3c6
|
|
| MD5 |
c70e4ad9e25f1f153ea8ed83381f976c
|
|
| BLAKE2b-256 |
9dfbd691ba2edb4d02d1d410b5420da9e3f07ea2ddcac14376251d426b6bf933
|
File details
Details for the file prosody_events-0.2.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: PyPy, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
84bfe3aef305986c9e3720f8022b822a0a21759b016e7059aadfb3be702d5212
|
|
| MD5 |
9e8ed090e32c252276e3262fd1649f1d
|
|
| BLAKE2b-256 |
1376b42cbe3c093e8ac53a33d9ec0b0bc2e58fb174e8582ab405804c80dc9ec8
|
File details
Details for the file prosody_events-0.2.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: PyPy, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1a7171324668bd43741f643b04d45a99875702bbbf07c4b0a83f43b05b23dd02
|
|
| MD5 |
d6cd561e475bb8419df885b996e9d452
|
|
| BLAKE2b-256 |
dd5803b84b92bddeef469d8a882204141cc5c80773e53b9d0955afc158f65824
|
File details
Details for the file prosody_events-0.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: PyPy, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f88e1dabd8871137fe338c925f5d73b2fa2ca0e74d998d3104d20d41d1486639
|
|
| MD5 |
9e13119a355311c3424694eace2ef7eb
|
|
| BLAKE2b-256 |
a92e8903e7daa5f3041ce044691620eef8f052c781f2049732f3a697673f3c2f
|
File details
Details for the file prosody_events-0.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.15, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
71d33489f8fda4e2ea8200d5a9af69d5047fe64be4dfb8aa19507ebacc261d9f
|
|
| MD5 |
51741b9c55a7a46b1a7e0762f4f1648b
|
|
| BLAKE2b-256 |
86c14b510b11a898d27f56ece5e735146f1b0c5358001ba6450cdf46f7b7b62a
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a41580a679dfcc3850ebad74469e9c491b58635d0110b8b115198e92ed1bf514
|
|
| MD5 |
d234535c1f2874b2e7e7912b8f210142
|
|
| BLAKE2b-256 |
c9837a0af67dead954d1ef5f08ce19a96e82c35e8b1f6962fefc1ef33f3d8146
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
567f478e45350c285c5da55f71ae1bf49bfeb8909f09ed028c96fb0688105e2d
|
|
| MD5 |
99af2196da42960f480eebb13c3a2223
|
|
| BLAKE2b-256 |
c69ae2bccfc9fc97a99c17e1d3dc8fd6ccab6da2c246a2118cfdd1376fc8a13e
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314t-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314t-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.14t, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52f02953e2784106a4a3977bb112086ecb7a7fdd51078664760422f64c9a432e
|
|
| MD5 |
08462832b72004d914eaf40e2078946f
|
|
| BLAKE2b-256 |
6c2a1e2292b910094978753fb9a41fd0f4fe84849e0b8e793d5c0983e6efca09
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6aa33f23c5bcaf7c6ec46a6de4c0b3045f335596c3a637e8e5fa1bcfea7afcbe
|
|
| MD5 |
1198940c9667ffb0d4f223539d3c031b
|
|
| BLAKE2b-256 |
433d5d972e2fb0d294e9c23f00e36403b48e49ccd824a476a1502ba913ddcbb6
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.14, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ba56dade75062129755073c91b723fc60148fa641d42d2dfb12608b5345d6de8
|
|
| MD5 |
6ba428cbfda37a78b05310f63ea407ae
|
|
| BLAKE2b-256 |
1b46c8825caa0dabc9c8a48087e98885f458a41d0768de37b034840395a9b0ae
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.14, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0e6e68d92c43d66124189874034fc6477b693e7f609223e1a569bfa00fb6fd27
|
|
| MD5 |
f3b649c7d5f0bdfdc83a8e8d3195b89e
|
|
| BLAKE2b-256 |
2672fe502070418aef0d80f4c3a4496ede001572e0c70e5c70e197b4e9c0a9f8
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.14, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a97e5e4ab44c140d5fb2e5f3f7e83ecdc4d8f99fdb75b5aa74b07fc7a9c572e1
|
|
| MD5 |
d1ef897ffa7f3d36c217be5b2977c4e9
|
|
| BLAKE2b-256 |
96a3e8219e70ce0777b6c23bfdb66679dfee6cd24b24d775f9264281f03b8c89
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e6be8b8f5920173a5888a6bb797d0c0ffe3ca518954305fa9b571214fbc58a07
|
|
| MD5 |
e7d7aab0b7b4b28f0221d5b906f53533
|
|
| BLAKE2b-256 |
66e5f2c1924d997facb2be7d09ee405ee249ce820a800377ab67a667f4d88ee4
|
File details
Details for the file prosody_events-0.2.0-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.5 MB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
03c21bef0e6df3ce69bd060b02a6e3ad59998e237555cc004e648ebb3c3314fe
|
|
| MD5 |
51b18e7e38abdf8a8cbdc95437351a1a
|
|
| BLAKE2b-256 |
6c983250b06a21e541d787d8d72546b809647b6b64f2e792cc24743aff9437ac
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.13t, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5144b9993a189ea6fbc10bb398064c6ad355be4d83cc9e23f7311d31b2d7285f
|
|
| MD5 |
6efad70804cc260549fcb04518ff6fad
|
|
| BLAKE2b-256 |
3ce4e6d7a2c113dae8076b955f4c39c2301c03ac16d9c9037e89f4922f746835
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.13t, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4b850ea2433456c4a51299121ae89dc0c21531d600e4e2b56cb7caa5756d493c
|
|
| MD5 |
b7d2c9edd2618d96639bb97af76e268d
|
|
| BLAKE2b-256 |
313669009633766a0a23e5b60bd430962cc6040df4bb72cef3dc2bbde251b8f2
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313t-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313t-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.13t, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
37620e4a484619d9c5f90b791275baee5135534842caa11517e4921a762e07a2
|
|
| MD5 |
c96a24748191fc8c4504f9dc4c92150d
|
|
| BLAKE2b-256 |
0d3c762ca191e9d31bd7d8be2567c6a5d6823a3c1a8d1f83b2a0b1493ae2349c
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
81c3c600dc77be17dc50c0535cd45b703e47d97d628ce1662737963ef3c6ca6c
|
|
| MD5 |
f59e5eb882bb943b9c96a8f0e5f657d8
|
|
| BLAKE2b-256 |
e989bf2eee5f2c860acb803ccdeae05e50d0db854829fa61c84da17fa0b5986c
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.13, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7106a15581457772fca982d6d7a7a53f898e63da552ae37b787b7f7f98dafa5f
|
|
| MD5 |
d6152efb932830e7c4345aa583ed1c1f
|
|
| BLAKE2b-256 |
d3fc59b98ce4aafbed1e7f29ec4ddda3ff0f9ef25b3e2e11c4410eb419c72d8b
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.13, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9e831fdeefa5015dcd0cdcadecb87888cc4d901e402502d455907fa0a5fb053
|
|
| MD5 |
7c0321bc1785078597c75feef1c3b8bd
|
|
| BLAKE2b-256 |
e00ccbe4d366dffa243d3f92c8a0427df42ac9ab5aa930e76373aa7254c37ea2
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.13, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43e2b5bb71a29e3a60056fcf068b61d4f10c1953060c9915427f5dbb39ce7fb8
|
|
| MD5 |
15bf2648afbae119e45af91367105a42
|
|
| BLAKE2b-256 |
72f56ae404e7044ab9b143d130b904a26ed569222b4a8e6b6d7aaa8cbce65d83
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa4b1134dd73f0e3665117ee663bba5087847a4a95fe7a714dd8bc220bbb27c6
|
|
| MD5 |
94067b8b9680287562c701207d007e74
|
|
| BLAKE2b-256 |
b2fa53d06715a00406f477833567b7cb9844a9b1863d8b284b7ec2d82aa6eb05
|
File details
Details for the file prosody_events-0.2.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.5 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8af0189f0257e3054adc6eeaf2ea95e9c59af86b2488b70491208b734e9d9920
|
|
| MD5 |
6741ba95cc8093840193d99d83053044
|
|
| BLAKE2b-256 |
1d645ead3c713ba6a9b223c6f18d923a876f7c417c9d6b166e98352f286f40ed
|
File details
Details for the file prosody_events-0.2.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
db1517fe3b0864736cc7a376008bdbc914df38e9293f244e0ff16abd91281d93
|
|
| MD5 |
0339af532121e1b435cfe4d18836a2d1
|
|
| BLAKE2b-256 |
cd7039ef7f15d23ffe4cc2f168114c810e2062f3f94c49e3a158a5f58450a0ad
|
File details
Details for the file prosody_events-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.12, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c4fd2ccb3d667d9898b16e2e211c31a8bcd02259ef1c9ee06e29f3998e90ac11
|
|
| MD5 |
9e67cffe60e1bb05d65df5e1745e6e94
|
|
| BLAKE2b-256 |
fc527c6e58aa99ad7a16bd7658009c71b36726a980d84e2a4e9f723c7807bf94
|
File details
Details for the file prosody_events-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp312-cp312-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.12, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
162e0794a6956c1d588a38679d9638c7a701aa6979920a558f9f73b365062456
|
|
| MD5 |
0fd61363b61602e8d99e3317665dcccb
|
|
| BLAKE2b-256 |
f05bcfe748a98643a7a7516517a6983b2ab5caff7c356c9a490275c28ac56885
|
File details
Details for the file prosody_events-0.2.0-cp312-cp312-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp312-cp312-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.12, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
98ebd7f9261793a4a462623de0529614c21a8dffc5a8240c64a7eae5c88e8841
|
|
| MD5 |
dfbdcbc39cf4e0eee41f7b484951b1fb
|
|
| BLAKE2b-256 |
ad0e01e3f54b749b18abc344813a5f77c96c63a4387ea838d73c99daedc5ae33
|
File details
Details for the file prosody_events-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9987230ed95e03dedef2d692aa591febfa1a008edd73e92cf9986379ac144ef6
|
|
| MD5 |
13ec600a454db1e9fad2c3fa1d5d21a2
|
|
| BLAKE2b-256 |
e809f27ba0b2ecbd62fcf5294306fd8f71461910b8640af0fb6ef23ed331ee10
|
File details
Details for the file prosody_events-0.2.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.5 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a834bf9e8e40da26fa0b7d81d6e4bb8ad082e8fe5f74134193dd6dc7a342b481
|
|
| MD5 |
1fa7aac555ab49363397622a3b9603e9
|
|
| BLAKE2b-256 |
c0a1aedf5dddb98aed3f21c1a1fbbae9bf0d33822129db434179838c032b98b0
|
File details
Details for the file prosody_events-0.2.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5b02e203d85b83c963251d7ae0fa43b5afab9ffc5105ba7e2873325c433cd5e2
|
|
| MD5 |
a337f220c08bfbea3ebd1eaf70c6922e
|
|
| BLAKE2b-256 |
a75d7759b78f7c6660fdba7f49bc51d66d4b1113a69edb1b836a28ae21b725b5
|
File details
Details for the file prosody_events-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.11, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4c257b0defe0478fcab0d31a1a81ab2c4803d6c000ce12cf11fcac013be14f2b
|
|
| MD5 |
a6e619dbba9695d765c3991b4c4fb3bc
|
|
| BLAKE2b-256 |
e0e52d7fa98cf9464877db2e7b6a57da394b10221724afce3fcc4b5466f151e8
|
File details
Details for the file prosody_events-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp311-cp311-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.11, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3903aeaa9187a70f4ce41b47150c4b74d2a00f01ae7f53c77c56b7ebc93141ee
|
|
| MD5 |
3e2884b8b975ad9dac6fda54136627f0
|
|
| BLAKE2b-256 |
fef26dd896971f577b229d39a7b8f4e4ff2a4b3ac019aabbf07f2ad3fa64dd21
|
File details
Details for the file prosody_events-0.2.0-cp311-cp311-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp311-cp311-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.11, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
34f7aad5d1fa51fa6ea435a720ecbf2d0eed7a7bea9d47056058710d406155b4
|
|
| MD5 |
007ed296fedb439b54b6234373ae6a06
|
|
| BLAKE2b-256 |
93a3ef9ec55b74016e32ffc58a048d5a06370b7bbf9bdf280c12c591f8e3203b
|
File details
Details for the file prosody_events-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b9c5805ab8eae2dd7c4f14ce9b404a56bb602b4b670e88361c915fe13b4e56d
|
|
| MD5 |
be53e13948df969e76b2bd673f5762f3
|
|
| BLAKE2b-256 |
1863a20ce3f9dd0c78e52cafd4a4d867f8877cfe6381c24530ff3a8758f93e1b
|
File details
Details for the file prosody_events-0.2.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 6.5 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
49432e875082075e11b6e88a3b9a2ab804c3cd38c2c3e076925d8ceb54ebd47d
|
|
| MD5 |
0ac0f54f6eca8d5c01c640802ff95b0e
|
|
| BLAKE2b-256 |
0a8e37edd0d82b1f2080071f63b7030ea3a84d10e13810babe69f5d94f5938c9
|
File details
Details for the file prosody_events-0.2.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
acd24ce791345ebf33966b4216aca9471669ea298bc7506125795ef28822a037
|
|
| MD5 |
e5f8616965411c65a66b0b2218cacc4b
|
|
| BLAKE2b-256 |
0c8888d9c8a2aae7c2b6b6b84bc488b696afbc5e29e4b87b701bbb28d42ba08f
|
File details
Details for the file prosody_events-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.10, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
91e37637535e2d2a812a8757653d04f8a1db4f4ca1fd494e74c79c218d419ace
|
|
| MD5 |
cd3a282b7ea1a4a2dbcb7ce5295fd779
|
|
| BLAKE2b-256 |
2a61526c4fd8b2bb5572457363ded329a33145630dc4c993182a8c4956127c00
|
File details
Details for the file prosody_events-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp310-cp310-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.10, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
62a2ec3d2c0bd444f6c1a7721cc9aef83de27fbf7a24f1a3d30c45eba622aa72
|
|
| MD5 |
1cf22dd5eefc6fdf782931b04f0deca7
|
|
| BLAKE2b-256 |
85820d3148edb33064a1afcaeccb9de31b2d028955d087df8ea09ef7f4d7ac61
|
File details
Details for the file prosody_events-0.2.0-cp310-cp310-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp310-cp310-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.10, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1efc73226e66f1da1b0417ad664bd78d6304333d54f0286bbc0bd71c16248f35
|
|
| MD5 |
73363b4d0495bcfadf95a42b1003699c
|
|
| BLAKE2b-256 |
21b2808d9c4106805c06d16b08d8466e4ea97d920882de9586fbd11cd1297cd6
|
File details
Details for the file prosody_events-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e0c16c3651f1fb97d23698eab8b2e3d931e8b9bd523e5de1ec14b139061eaf04
|
|
| MD5 |
05bebdbdfe1967a07a48c07dc95bd110
|
|
| BLAKE2b-256 |
373b691c0b51e18b6477df6e776c0c5c25c3156558063edd151742d5efaace0d
|
File details
Details for the file prosody_events-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp39-cp39-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.9, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
86df486c9c195ca7f5f5c67043b1e551f60c64e6fbf5e5d1e8d31d1e9b14d0ce
|
|
| MD5 |
f45f6fc9865aab6f4d7c06c9f8769ab2
|
|
| BLAKE2b-256 |
967430cfed7a35336f0d033a0575f81c5565ebef1d3403f090c5944651ae176d
|
File details
Details for the file prosody_events-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp39-cp39-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.9, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1630c3ed208d43a5a6c286eccbe7374e8ab6157f46550f7fb77f65c282dbea1b
|
|
| MD5 |
237f7c4975a81b932cd7ec7b7b27cb85
|
|
| BLAKE2b-256 |
eec129f9d0b87e7d590819a796979ebad7a2061a943aa8b8125ba5218cd6fca1
|
File details
Details for the file prosody_events-0.2.0-cp39-cp39-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp39-cp39-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.9, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f167c9707b58005d028bd3e29f5e6db9e84058200900455f974d90db0fcf69c
|
|
| MD5 |
e33377a18becac8ec97ac3a3a8d58a38
|
|
| BLAKE2b-256 |
f0254e26e5c0c8c34099eea5fc744e46f439032cdb16fe1671bc42b584786548
|
File details
Details for the file prosody_events-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b2cf8b6229ce6673f56ece9e154e3dce093417a809ab046bdb4e0f87044ffb0f
|
|
| MD5 |
9d302aab87c5ba0fb0d1c291a6069841
|
|
| BLAKE2b-256 |
84b89f19c79fc8b48a0617f80e2f7b9334c56de9d47e845926f0360b2d23fdcf
|
File details
Details for the file prosody_events-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp38-cp38-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 7.5 MB
- Tags: CPython 3.8, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5741074b5694150b8b01d39a928c0690c74463a2e851f5ff76f8b2f017497248
|
|
| MD5 |
7e03f5fe77e579bb5ed1478d1229fb96
|
|
| BLAKE2b-256 |
475b67c41fff2ba45685c1d3ddda02ff4e28db24a059ec5163c246c434722cd3
|
File details
Details for the file prosody_events-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp38-cp38-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 7.3 MB
- Tags: CPython 3.8, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d4d36e490d8b83d3819bc12ead9070a24278df121a603c87f93de95dbfad35cd
|
|
| MD5 |
bd92491041b8e449c7a65eaa1726e4f6
|
|
| BLAKE2b-256 |
2a652db77ecb2220c864f090301852d60ca909ebf6a40389ed8f51a41d3c2442
|
File details
Details for the file prosody_events-0.2.0-cp38-cp38-manylinux_2_24_aarch64.whl.
File metadata
- Download URL: prosody_events-0.2.0-cp38-cp38-manylinux_2_24_aarch64.whl
- Upload date:
- Size: 7.0 MB
- Tags: CPython 3.8, manylinux: glibc 2.24+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.11.13 {"installer":{"name":"uv","version":"0.11.13","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25db5e9d65ee2d4d19e3aaf12b5bdcc707cbea313dfc6ef1ea31f57ec9fc29f3
|
|
| MD5 |
7917151a2c1865a0efa5d4fb94c7f486
|
|
| BLAKE2b-256 |
6607c7cd63675be69fe68e7c66ee284bb536ff0f87f5750392aa632c36a43aa9
|