Skip to main content

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)
  • Type Checking: PEP 561 type information for mypy and other Python type checkers

Installation

Prosody supports Python 3.10 and above, including free-threaded builds (3.14t). Install from PyPI:

pip install prosody-events

The wheel includes a py.typed marker and type information for the public API, so applications can type-check normal prosody imports without installing a separate stub package. For example, run mypy your_application/ after installing Prosody and mypy. Keyed-state definitions carry their declared value type through Context.state(...). EventHandler[Payload] carries a declared structural JSON payload type through on_message; an unsubscripted handler defaults to JSONValue. See Keyed State for typed examples.

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

Keyed State

Register keyed-state collections before you subscribe. Persistence is backed by Cassandra and is not needed when mock=True. See the Keyed State feature section for handler usage; the client-level knobs and per-collection fields are below. Where an option and an environment variable are paired, an explicitly set option wins; otherwise the environment variable applies, then the default.

Option / Environment Variable Description Default
state_collections / - Keyed-state collections to register before subscribe (list of definition objects; duplicate names are rejected) (none)
state_cache_dir / PROSODY_STATE_CACHE_DIR Disk workspace for the local keyed-state cache; each live client needs its own directory (it is locked exclusively) per-client temp dir
state_cache_size_bytes / PROSODY_STATE_CACHE_SIZE_BYTES Capacity of the in-memory keyed-state cache, in bytes; must be greater than 0. One cache is shared by all partition keyspaces engine default
state_recovery_delay / PROSODY_STATE_RECOVERY_DELAY Delay before the recovery sweep; every collection TTL must strictly exceed it. Whole seconds >= 1 (timedelta or float seconds; the env var accepts a duration string like 30s) 30s

Each state_collections entry has these fields. Prefer the definition constructors (value / map / deque and their message_* variants, documented below): they serialize into state_collections so you declare each collection once and reuse the same object with context.state().

Field Description Default
name Collection name; non-empty and unique within the client (required)
kind "value", "map", or "deque" (required)
payload "json" (JSON values) or "message" (the full Kafka message the handler received) (required)
ttl Per-write TTL, whole seconds >= 1 (must exceed the recovery delay); timedelta or int seconds (none)
read_uncommitted Opt out of transactional staging (read-uncommitted) false
keyset_limit Map-only; ordered-scan bound in 0..=4096 (0 disables ordered-scan tracking) 128
capacity Deque-only; positive int max slot count, enforced lazily on push (runtime-only, may change across deploys) (unbounded)

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:

  1. /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.

  2. /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

  1. The probe server starts automatically when the consumer is subscribed and stops when unsubscribed.
  2. A partition is considered "stalled" if it hasn't processed a message within the stall_threshold duration.
  3. The stall threshold should be set based on your application's message processing latency and expected message frequency.
  4. Setting the threshold too low might cause false positives, while setting it too high could delay detection of actual issues.
  5. 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 prefix user.
  • {"type": "account.deleted"} matches prefix account.

✗ No Match:

  • {"type": "admin.user.created"} doesn't match user.
  • {"type": "my.account.deleted"} doesn't match account.
  • {"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 group_id to allow loopbacks; defaults to group_id
    subscribed_topics="my-topic"
)

Or via environment variable:

PROSODY_SOURCE_SYSTEM=my-service-producer

How It Works

  1. Producers add a source-system header to all outgoing messages.
  2. Consumers check this header on incoming messages.
  3. 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 time
  • clear_and_schedule(time): Clears all timers and schedules a new one
  • unschedule(time): Removes a timer scheduled for the specified time
  • clear_scheduled(): Removes all scheduled timers
  • scheduled(): 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 to
  • time (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
)

Keyed State

Keyed state gives every Kafka key its own durable working memory. Prosody automatically uses the current message or timer key, so a handler can relate the current event to earlier events for that key. State survives restarts and rebalances. By default, changes become visible only when the event succeeds.

Use keyed state for time-aware stream processing: counters, deduplication, rolling aggregates, pending work, and per-key workflows. Keep your relational database as the source of truth for business data and for work that needs joins or ad hoc queries. Reconstructing stream state with repeated database queries can be slow and expensive; keyed state is built for that job.

Most collections should have a TTL. Set it comfortably beyond the longest timer or workflow that uses the state; Prosody validates the minimum supported TTL. Omit it only when keeping inactive keys forever is intentional.

A counter for each key

Declare each collection once, register it on the client, and ask the event context for the current key's state:

COUNTER: ValueDefinition[int] = value("counter", ttl=timedelta(days=30))


class CountHandler(EventHandler):
    async def on_message(self, context: Context, message: Message) -> None:
        count = context.state(COUNTER)
        await count.set((await count.get() or 0) + 1)


client = ProsodyClient(
    group_id="counters",
    subscribed_topics="events",
    state_collections=[COUNTER],
)

Here, counters expire after 30 days without an update.

Window activity into one notification

This example turns a burst of activity into two useful notifications. It sends the first event immediately, collects later events for five minutes, then sends one summary. Because the user ID is the Kafka key, every user gets an independent window.

WINDOW: ValueDefinition[bool] = value("window", ttl=timedelta(days=1))
PENDING: MessageDequeDefinition[Activity] = message_deque(
    "pending", capacity=100, ttl=timedelta(days=1)
)


class BatchHandler(EventHandler[Activity]):
    async def on_message(self, context: Context, message: Message[Activity]) -> None:
        window = context.state(WINDOW)
        pending = context.state(PENDING)

        if await window.get():
            await pending.append(message)
            return

        await notify(message.key, [message])
        await window.set(True)
        await context.clear_and_schedule(
            datetime.now(timezone.utc) + timedelta(minutes=5)
        )

    async def on_timer(self, context: Context, timer: Timer) -> None:
        pending = context.state(PENDING)
        batch = [message async for message in pending.values()]

        if batch:
            await notify(timer.key, batch)
        await pending.clear()
        await context.state(WINDOW).clear()

See the complete, mypy-checked example for imports, types, client setup, and notify: examples/keyed_state_windowing.py.

Why this works:

  • Register both definitions in state_collections before subscribing. Keyed state uses Cassandra unless mock=True.
  • Use clear_and_schedule, not schedule, so a retried event does not add another timer for the same key.
  • capacity=100 and the one-day TTL prevent an inactive or unusually busy key from retaining an unlimited backlog. Since this example only appends, overflow drops the oldest saved message.
  • A message_deque requires the original Kafka messages to remain available for the whole window. Use a plain deque of payloads if topic retention or compaction cannot guarantee that.
  • Prosody runs one handler at a time for each key, so a user's message and timer handlers cannot overlap.
  • Sending a notification is outside Prosody's state transaction and may happen again after a retry. Give notifications a stable idempotency key, or send them through an outbox, when duplicates matter.

Collections and handles

A definition gives a collection a stable name, kind, and options. Register it once on the client, then pass the same definition to context.state() to access the current key. Do not reuse a persisted name for a different collection kind or payload type.

Create handles inside the handler and do not retain them or their iterators afterward.

Collection JSON payload Kafka message Main operations
Value value message_value get, set, clear
Ordered string map map message_map get, get_many, contains, set, remove, items, keys, clear
Deque deque message_deque append, appendleft, pop, popleft, get, size, values, clear

All operations are async. Map and deque scans use async for. Map keys are strings. None means absence and cannot be stored—use clear() or remove() instead. Payload annotations guide the type checker but do not validate data at runtime.

When changes become visible

Reads inside a handler see its earlier writes. The default behavior is the safest choice for most handlers: Prosody buffers those changes and publishes them together when the event succeeds. If the handler raises, none of its pending changes become visible.

Each collection also offers explicit controls for workflows that need different behavior:

  • read_uncommitted=True writes that collection's changes after the handler succeeds but before the event is recorded as complete. A crash in between can leave the changes visible even though the event is retried. Use it only for idempotent changes, where processing the same event again produces the same stored result.
  • await state.commit() immediately publishes this collection's pending changes. They remain visible even if the handler later raises and the event is retried.
  • await state.rollback() discards this collection's pending changes since its last commit(). It cannot undo changes that were already committed.

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:

  1. Natural Idempotence: Use inherently idempotent operations (e.g., setting a value in a key-value store).

  2. 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.
  1. Database Upserts: Use upsert operations for database writes (e.g., INSERT ... ON CONFLICT DO UPDATE in PostgreSQL).

  2. 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.
  1. Idempotency Keys for External APIs: Utilize idempotency keys when supported by external APIs.

  2. 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.
  1. 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:

  1. Completion and commitment of all in-flight work
  2. Quick rebalancing, allowing other consumers to take over partitions
  3. 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:

  1. Exit promptly when cancelled to avoid rebalancing delays.
  2. Use try/finally or 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:

  1. Trigger: The release process is triggered automatically on pushes to the main branch.

  2. 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.
  3. 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.
  4. Artifact Upload: Each build job uploads its artifacts (wheels or sdist) to GitHub Actions.

  5. Publication: If all builds are successful, the final step publishes the built artifacts to PyPI.

Contributing to Releases

To contribute to a release:

  1. Make your changes in a feature branch.
  2. Use Conventional Commits syntax for your commit messages. This helps Release Please determine the next version number and generate the changelog.
  3. Create a pull request to merge your changes into the main branch.
  4. 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: JSONValue) -> None: Send a JSON-serializable message.
  • consumer_state() -> str: Get the current state of the consumer.
  • subscribe(handler: EventHandler[P]) -> None: Subscribe while preserving the handler's payload specialization.
  • 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 generic over the message payload type. The payload type defaults to JSONValue, so existing unsubscripted handlers retain their current typing. Parameterizing the handler gives on_message the same payload type:

P = TypeVar("P", default=JSONValue)

class EventHandler(ABC, Generic[P]):
    @abstractmethod
    async def on_message(self, context: Context, message: Message[P]) -> 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

For example, EventHandler[OrderEvent] receives Message[OrderEvent] when OrderEvent is a TypedDict. This is a static contract only: Prosody still delivers plain JSON and does not construct or validate dataclass or Pydantic models. Validate the payload explicitly before using such a model.

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: P: The statically typed message payload.

Message[P] defaults to Message[JSONValue]. Supplying a TypedDict payload specialization gives field-level checking without runtime model construction or validation.

Context

Represents the context of a Kafka message, providing timer scheduling methods:

  • schedule(time: datetime) -> None: Schedules a timer to fire at the specified time
  • clear_and_schedule(time: datetime) -> None: Clears all timers and schedules a new one
  • unschedule(time: datetime) -> None: Removes a timer scheduled for the specified time
  • clear_scheduled() -> None: Removes all scheduled timers
  • scheduled() -> List[datetime]: Returns a list of all scheduled timer times
  • should_cancel() -> bool: Check if cancellation has been requested (includes timeout and shutdown)
  • on_cancel() -> Coroutine: Awaitable that completes when cancellation is signaled
  • state(definition) -> ValueState[T] | MapState[V] | DequeState[T]: Binds a registered collection for the current event attempt, returning a typed handle (message definitions vend *State[Message[P]]). Raises PermanentStateError when the name was never registered, or when the definition's kind / payload disagrees with the collection's durably-registered schema. See the Keyed State API reference below.

Timer

Represents a timer that has fired, provided to the on_timer method:

  • key: str: The entity key identifying what this timer belongs to
  • time: datetime: The time when this timer was scheduled to fire

Keyed State

Definition constructors (each returns a frozen definition object used both in state_collections and with context.state()). Each accepts ttl and read_uncommitted, plus keyset_limit on the map variants:

  • value(name, *, ttl=None, read_uncommitted=None) -> ValueDefinition[T]
  • map(name, *, ttl=None, read_uncommitted=None, keyset_limit=None) -> MapDefinition[V]
  • deque(name, *, ttl=None, read_uncommitted=None, capacity=None) -> DequeDefinition[T]
  • message_value(name, *, ttl=None, read_uncommitted=None) -> MessageValueDefinition[P]
  • message_map(name, *, ttl=None, read_uncommitted=None, keyset_limit=None) -> MessageMapDefinition[P]
  • message_deque(name, *, ttl=None, read_uncommitted=None, capacity=None) -> MessageDequeDefinition[P]

ValueState[T]:

  • get() -> Optional[T]
  • set(value: T) -> None
  • clear() -> None
  • commit() -> None
  • rollback() -> None

MapState[V] (keys are str):

  • get(key: str, default=None) -> Optional[V] | default — default only on absence
  • contains(key: str) -> bool — cheap presence check (no decode/resolver)
  • get_many(keys: List[str]) -> List[Optional[V]]
  • set(key: str, value: V) -> None
  • remove(key: str) -> None
  • clear() -> None
  • items(direction=Direction.FORWARD) — async iterator over (str, V) entries
  • keys(direction=Direction.FORWARD) — cheap async iterator over str keys
  • values() — async iterator over V values (forward-only)
  • __aiter__() — forward async iteration over str keys (like dict)
  • commit() -> None
  • rollback() -> None

DequeState[T]:

  • append(item: T) -> None
  • appendleft(item: T) -> None
  • pop() -> Optional[T]
  • popleft() -> Optional[T]
  • peek() -> Optional[T] — back endpoint, non-destructive
  • peekleft() -> Optional[T] — front endpoint, non-destructive
  • size() -> int
  • is_empty() -> bool
  • clear() -> None
  • get(index: int) -> Optional[T]
  • values(direction=Direction.FORWARD) — async iterator over T elements
  • __aiter__() — forward async iteration over T elements
  • commit() -> None
  • rollback() -> None

Direction: an enum with Direction.FORWARD and Direction.BACKWARD.

Errors:

  • StateError: brand mixin on every keyed-state error; catch all of them with except StateError.
  • TransientStateError (subclasses TransientError): the default — a temporary store read/write failure, or any caller mistake (a None/unrepresentable write, item-shape mismatch, invalid scan direction, malformed definition), rejected transient so it retries rather than discarding the message.
  • NullValueError (subclasses TransientStateError and ValueError): a None / JSON-null write; use clear() / remove(key) to delete instead.
  • PermanentStateError (subclasses PermanentError): reserved for failures a retry cannot resolve in-process (unregistered / identity-mismatched collection, duplicate registration), or one a handler raises explicitly.

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

prosody_events-0.4.0.tar.gz (149.2 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl (10.0 MB view details)

Uploaded PyPymusllinux: musl 1.2+ x86-64

prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl (9.8 MB view details)

Uploaded PyPymusllinux: musl 1.2+ ARM64

prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.whl (9.5 MB view details)

Uploaded PyPymanylinux: glibc 2.24+ ARM64

prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded PyPymanylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.15tmanylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.15manylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl (10.0 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ x86-64

prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.14tmusllinux: musl 1.2+ ARM64

prosody_events-0.4.0-cp314-cp314t-manylinux_2_24_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.24+ ARM64

prosody_events-0.4.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.14tmanylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp314-cp314-win_amd64.whl (10.0 MB view details)

Uploaded CPython 3.14Windows x86-64

prosody_events-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl (10.0 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ x86-64

prosody_events-0.4.0-cp314-cp314-musllinux_1_2_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.14musllinux: musl 1.2+ ARM64

prosody_events-0.4.0-cp314-cp314-manylinux_2_24_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.24+ ARM64

prosody_events-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp314-cp314-macosx_11_0_arm64.whl (8.8 MB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

prosody_events-0.4.0-cp313-cp313-win_amd64.whl (10.0 MB view details)

Uploaded CPython 3.13Windows x86-64

prosody_events-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl (10.0 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ x86-64

prosody_events-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.13musllinux: musl 1.2+ ARM64

prosody_events-0.4.0-cp313-cp313-manylinux_2_24_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.24+ ARM64

prosody_events-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp313-cp313-macosx_11_0_arm64.whl (8.8 MB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

prosody_events-0.4.0-cp312-cp312-win_amd64.whl (10.0 MB view details)

Uploaded CPython 3.12Windows x86-64

prosody_events-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl (10.0 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ x86-64

prosody_events-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.12musllinux: musl 1.2+ ARM64

prosody_events-0.4.0-cp312-cp312-manylinux_2_24_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ ARM64

prosody_events-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp312-cp312-macosx_11_0_arm64.whl (8.8 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

prosody_events-0.4.0-cp311-cp311-win_amd64.whl (10.0 MB view details)

Uploaded CPython 3.11Windows x86-64

prosody_events-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl (10.0 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ x86-64

prosody_events-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.11musllinux: musl 1.2+ ARM64

prosody_events-0.4.0-cp311-cp311-manylinux_2_24_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ ARM64

prosody_events-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

prosody_events-0.4.0-cp311-cp311-macosx_11_0_arm64.whl (8.8 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

prosody_events-0.4.0-cp310-cp310-win_amd64.whl (10.0 MB view details)

Uploaded CPython 3.10Windows x86-64

prosody_events-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl (10.0 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ x86-64

prosody_events-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl (9.8 MB view details)

Uploaded CPython 3.10musllinux: musl 1.2+ ARM64

prosody_events-0.4.0-cp310-cp310-manylinux_2_24_aarch64.whl (9.4 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ ARM64

prosody_events-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.8 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

File details

Details for the file prosody_events-0.4.0.tar.gz.

File metadata

  • Download URL: prosody_events-0.4.0.tar.gz
  • Upload date:
  • Size: 149.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0.tar.gz
Algorithm Hash digest
SHA256 5665f6c011f76e4578b3a6a7b3bde3a32ff7e9e4dd9457210dcfe9adb4cb1d3f
MD5 0565ff24cfc3dab0b73b6403bfcc6094
BLAKE2b-256 9f0cee460e8de1377d1b94a44eddd7b50a28d1c5de79afe3e30d6c54fc9c8ff8

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: PyPy, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 a2ecae25dfc27f14ea7cb66864f885249de84c55e2b1f58838bc3483c42a5ad7
MD5 02bfbeceb68bbc36d284e8062bbf06d1
BLAKE2b-256 30c6552e3b33ff2eb9f6fa629c98beb12242037e9a6f8c2076843f0c77d91644

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: PyPy, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 ec8d1ffcead717fa5acd3d9f16aba817880edc31deb2a7d054b92f71d7efbf6f
MD5 dbfb6e01c628ad10cc43bb26df3e9aed
BLAKE2b-256 9da5fcddc57ffd4313be5aacf681fc2a7eb47906e980648e1b2957c142ff88ea

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.whl
  • Upload date:
  • Size: 9.5 MB
  • Tags: PyPy, manylinux: glibc 2.24+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 7d52df229ddfb3c0da1be1d7bdc3a3fa480404336dbf6c76fe9d76f9657d0d09
MD5 d94628a422466fc082b90e9417ce8bd9
BLAKE2b-256 6eee2568e6ce349cb532ea1e0d0a4da594de4a0f9fd569b501472620467b00a0

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: PyPy, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 aad18566d155102c3a5f57a7ed96a7b45b1e8671f642aa783abc4c0d481dbd7f
MD5 58143a890a2f5673d52b1fc0cfdf9713
BLAKE2b-256 1a8dc8a1c51a5c4fea61cb40da61ec21827bac3893f103fa43f1420da1df7adb

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.15t, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp315-cp315t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 112f96f7d772ce2ee182dc6e2fdaab6dd210165cde45b9293ae6a5a8ff6ff7f5
MD5 bb00d8cec0fd2f8a417f60dbdbf0e8e6
BLAKE2b-256 c266a57b63d04e06d0cfd4bedcaa003e913cb290b7ec404eaa107fb19b73d0fe

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.15, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp315-cp315-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b95e60a23571fc3d098f8e5a20f9e9b7eadb08f988e5a00f49465534869ecb5b
MD5 fa567b5e53279bfa7e229e31751eb79f
BLAKE2b-256 8e98b2ffb7e571cfeb2e6e392ef5ef6b8f2dba3167c83069a434e16afbc4861c

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.14t, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 2deff038f47bc0a513e027c1c33b5ef442e33f092f7aaeeb752493b4d31a73c7
MD5 3cb2b3e6907c78f7a822a730fc47b3f2
BLAKE2b-256 a9f7cf8dc78419857d34fd857ebca8f7674beca8e9d2f9ebbeea1f0626fbb3c1

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.14t, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 e4c550c9149929eea46634d5252c0db42d7f0ac498b70c28a7494a8b43f65bfb
MD5 323b1fe358de314fa44d33d7527771de
BLAKE2b-256 18ce90e0f9e12615b62c31f78bddba197d7c7c4e0a0572aed312fbb7a917f748

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314t-manylinux_2_24_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314t-manylinux_2_24_aarch64.whl
  • Upload date:
  • Size: 9.4 MB
  • Tags: CPython 3.14t, manylinux: glibc 2.24+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314t-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 552e39f4df6639daa03677ceebb14428bd4e64ecea9196caabd538819b08486a
MD5 45182016ad7b1f0907b70262d25146d6
BLAKE2b-256 93cfcb94813d97c348f1ade7cd30c99ab1382911a62a9bba4c48c1875f57937a

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.14t, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 e49b569f4a68f50cb2572734427de11f07184b89b8085156ed83fefbea3edaaa
MD5 7363ddb67f11465dbb19aea7f112398c
BLAKE2b-256 d355305a8c51e042a82b4d690ace2cd0a941009f4ecebb633420ecc237780fc0

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314-win_amd64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314-win_amd64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.14, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 313e9215b2fcc4be532e52d333d1349504e2f1bc9cb0d6157795821effbfc4c5
MD5 7ca0b632ab9e3e7808c938fb6fd8416d
BLAKE2b-256 788d60f999fbfe3bffeb14bc61fe8870c1adc8ac6568d97b9a77e3c8311cb862

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.14, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 d3433f4fc2a3dadc6545954988bd6b65225f4c3317f7a40d9c16423047fc803d
MD5 90242f1eccb22faf36baf7e1cc51cab6
BLAKE2b-256 076491a97aed9c58c6b74448d69cc2d839ef75b23cf61669e0734ff09563ba89

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.14, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a90cdab206c8598b8e22b49fb6dc5d8dc26f5ca1382cc4d526c4d4a1c2b001c4
MD5 a1c6a76b63e3c95447543c97b177eec3
BLAKE2b-256 1dfda15d5683bc92f3512413a13c9258f0091186ce46ce7c2ecda2a16bbe2974

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314-manylinux_2_24_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314-manylinux_2_24_aarch64.whl
  • Upload date:
  • Size: 9.4 MB
  • Tags: CPython 3.14, manylinux: glibc 2.24+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 60812dda372cddf677ca54cde56616e3f4de21fbda968996bdbae27c44a5579d
MD5 19f12e90b24ba7bd0b3283f89d3b4b19
BLAKE2b-256 b621cf0731e3bb850654597599feeb94070198312cf80f8b0b7456f94773bf08

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.14, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 ecfa17646b0b9b502c524cea117c30fc36ed164662eee2eb708a35a0a08470b6
MD5 0d30af71e58728602a27adbf39aad699
BLAKE2b-256 cf70b1fb7f6becd93e15efefbbf966d4298cb3f8c20ef54042578fda66842d6d

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 8.8 MB
  • Tags: CPython 3.14, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 254ece1786af937ec90e3e09890c860479e026ce3049219a1d310a06fdf8ec29
MD5 1108ad21bd6e749fed53a225916bc9e8
BLAKE2b-256 9dc905c59cbc7e72633e2b7214769101f373a1dd5c0ed87742436741f628a000

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp313-cp313-win_amd64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp313-cp313-win_amd64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.13, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 3db067c58f5338e979ae5289c72afcbafe6a48d48f92c0bc2f5977d719886e7d
MD5 67fb61417460f290ca5fc835e7d99d5d
BLAKE2b-256 8a024af6b9ab5d6cf90e56d3d051efd693d6d765e706c21d30365d8c95aac382

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.13, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp313-cp313-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 92337e6e886b904a8362ee7dfe41911fe610607761dc5f5146c74d5bc6529f14
MD5 276cd68b3d7a5ee5d99c40d04c9d1bed
BLAKE2b-256 cc9eb2664281e344ae147c566aaa8c892c49199d62f3933509fb9bf258b502b0

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.13, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp313-cp313-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 a661926a8e4aa7d4b70226ce66e473dbbf4e18d57196022fadf58be86b997edf
MD5 6e6c70d777f8f7d2acf4e341b6ff4811
BLAKE2b-256 8441f6b99ecaa38a94e4941e2d432f69455ca3d4602e69e9fd095fa83d284056

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp313-cp313-manylinux_2_24_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp313-cp313-manylinux_2_24_aarch64.whl
  • Upload date:
  • Size: 9.4 MB
  • Tags: CPython 3.13, manylinux: glibc 2.24+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp313-cp313-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 4cbe22a598c8c0bcab764e8375775ecd1540869b7af06ce931b0ad3710addb37
MD5 88aa934da52843d25c3dc79d91c46592
BLAKE2b-256 5d1bf14771259ca133f42e139740f95797518cb142f722067568fb3e1e34641e

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 c22dfbe9492e16e08f0f19bc5d424165fb4afc6845dd7e092528705e35a5c4e7
MD5 f9bc63cfba9f29e36c9b619578c6aab4
BLAKE2b-256 cea1300d597dc28bcef77443e8b047480789bf7e384007b71a1c750e856351a0

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 8.8 MB
  • Tags: CPython 3.13, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e610ae20fcb0a948217beac174166f7163ced3091ce036fe92b192b3b070d410
MD5 1a6cd808fac7d9ce09573fba6932e268
BLAKE2b-256 6dfdcfa70e847da57655e3a056625ab7b4d7731c249926b98356e9403834eb25

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 3ccdd302a4f8e78afe979f3cb77f2cb3c447c36f79f15b704cf167836738d5a3
MD5 926f1f7bd330911f37d58935d50cc5f6
BLAKE2b-256 8e33fa8b662a193d045cf8044ede801ad6ccd01155ed36187a2e101e628c896d

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.12, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 0cd91d844e7e74552b5e5ec7dc38df7814c8ff9d9dc72538827cc087586b5b13
MD5 f67d771c2817ad71465a8c00939bae21
BLAKE2b-256 5e7ff3319030dcfbca72b5a9e4a774e31239e73e6c27387992b76906ca6dbd96

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.12, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp312-cp312-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 1eb6fa3cfbae218f10e5cd8895cdf260a21fe5ee86a70872970fffbf1fd87aad
MD5 aaf331cb3cf2218423ddc0dc769c0936
BLAKE2b-256 a4b00f2d8ad2d8bb089db8b3d9dba04665c880b9fd04471be71aa1d913c67907

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp312-cp312-manylinux_2_24_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp312-cp312-manylinux_2_24_aarch64.whl
  • Upload date:
  • Size: 9.4 MB
  • Tags: CPython 3.12, manylinux: glibc 2.24+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp312-cp312-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 80035687af7cbee3d5b24422f35b7157bc617594bf67d3f00e5543523d5e6436
MD5 85a32fbc507b6177350b11267cc53bd7
BLAKE2b-256 b3ca580249988c5270b4a9409e47313e0201e0b385940c30e8e5afcd997a461c

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 cfc02a32e1ea10a59b061bf3fb04beb33efe5b7ed33148e464fc71cded0898a0
MD5 3961e0f74aef6d9d9745c47db8fa0e75
BLAKE2b-256 37b4fcd1175df344a105fa312dc872c9ff2e66977ce513e1801ac988319b7ba9

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 8.8 MB
  • Tags: CPython 3.12, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8ba4882a35ba60c310f650e591fbbf6aa189e6cabc948bf5d836c37b8e49fcd3
MD5 17e7b228efbb045bec34cce17a437177
BLAKE2b-256 573813f0f900e67a3cc7330ca1297fbe5c243362544d9c1a8ca969233155bb3f

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 638c1396fccb5ff52104982539045faa443cea7193f6cff8455fbddeb414b322
MD5 87838cf89967e9cdc9103e66055fc459
BLAKE2b-256 a371029a6203fc6cf536d5120c1d312e9ba48ffc92a3ddb6830680a9b1449987

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.11, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4a3d07b67724a767a2ef792626ff6aabc85def6f71716d880023f753e7151c77
MD5 417e0a53a84552a74d242a9ce0b01d41
BLAKE2b-256 efed98c0ac77fdff6412633d09080da7f74d16d4a1d26f1e246d41080e4573bf

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.11, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp311-cp311-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 c75e82e064a9f212e65d0d25d519028db6da8fe93fc98202ddb9062a2736026f
MD5 69bc769339dd76649f94c86aa885e610
BLAKE2b-256 a47ce1b871044e5fb0fa988703c88d96bd00d8ef2746b3e0bcb329116db01bfe

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp311-cp311-manylinux_2_24_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp311-cp311-manylinux_2_24_aarch64.whl
  • Upload date:
  • Size: 9.4 MB
  • Tags: CPython 3.11, manylinux: glibc 2.24+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp311-cp311-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 e9fa3e5fc51034accc5ebe467eb13dbc696e2351b3f49191b1f220f7e06bdd93
MD5 7eb2401882b7be616eaa6cb0d471421d
BLAKE2b-256 efb9aa873667b1175cf739ca89a8914df13ed1383f1c77941986a803417cd4ec

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2627cc9337a2bbbf3c39e68c248d3b3fafdf0ddc0d597498d25f2d97b1f0fd4a
MD5 045aa91d8312c15ec21f01be90743efb
BLAKE2b-256 dd29686735ffe2828814ae8e75c0d5be5636eb93774b9cfe3f2a3b7df644bfe5

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 8.8 MB
  • Tags: CPython 3.11, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b19d616c84e7b1c61a2e089f1757ff293077acf1926ba3bd518c3ebecb6efe80
MD5 970043f84f69e1b26e22de6b65d4e70f
BLAKE2b-256 429af0ca601e96a7f69c0e55dbcd84c80aa32d2f9c9f8812540801ddf894a6b4

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 6098f95e45ad3ccca79598e40a590bdd92fb25d9895ed1cf6c7aac49aabcbb57
MD5 b75a3a91e4c2fd5d9aa9446631d1ab3a
BLAKE2b-256 1e5cca38be9015d43de4acc694c28a2df04a06a54baab033e057200e400fd562

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl
  • Upload date:
  • Size: 10.0 MB
  • Tags: CPython 3.10, musllinux: musl 1.2+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4e8c09439e8eb59e2b3dc66effbe742fb664c1f8309e13e7c407f081f8c8c02f
MD5 5df119d0b5b84a7d14c783dc8969ea0d
BLAKE2b-256 3935237c792ffad0e78f97a1dd75ffe0dde756af7cf6b63bcfab01fa063ffd09

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.10, musllinux: musl 1.2+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp310-cp310-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 52cf18dced349f5f3988a372b8e1d4e47cd7c31e38cb52de986fde6bc57be60c
MD5 4262915c338205e7a5e6b0e6b94c408c
BLAKE2b-256 b5d7dbf941d8e4b2a895384b9ac5746547633d16601e6fdd85fe8888af3663fc

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp310-cp310-manylinux_2_24_aarch64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp310-cp310-manylinux_2_24_aarch64.whl
  • Upload date:
  • Size: 9.4 MB
  • Tags: CPython 3.10, manylinux: glibc 2.24+ ARM64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp310-cp310-manylinux_2_24_aarch64.whl
Algorithm Hash digest
SHA256 1cfe551ca7c36a6f285f76deac4a293f2a94a15dc733942ad4c268822cea913e
MD5 21a6c3cd3dcd3e7cd84a7b1d3c7a0307
BLAKE2b-256 ce91494cb54808dda7de145523dd9471e71490407ca78661c77076d0e46d7617

See more details on using hashes here.

File details

Details for the file prosody_events-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

  • Download URL: prosody_events-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
  • Upload date:
  • Size: 9.8 MB
  • Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.30 {"installer":{"name":"uv","version":"0.11.30","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

Hashes for prosody_events-0.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f15b31e66185252b2da1eb3b8896a63733a304ea6c4c4cc0ffef4bc0f66bbf22
MD5 0900a1ab2cf5bb31723803c6e183a955
BLAKE2b-256 09cc8226ece6ce7c412a979ddd3b19ab07bd9c88e8ab1fe29b73255b70f6c817

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page